From 0d846afedbc22c13684434cb3b10927859335da0 Mon Sep 17 00:00:00 2001 From: Jason Date: Thu, 7 Jun 2012 10:52:53 -0400 Subject: [PATCH 1/3] A SelectFieldRenderer that has a relationship for it's column property will now automatically use the default from the associated foreign key column. The default is only used when the bound model is a new instance (inserting a row, not updating) and the value is already set to None. --- formalchemy/fields.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/formalchemy/fields.py b/formalchemy/fields.py index eb3e684..6296f96 100644 --- a/formalchemy/fields.py +++ b/formalchemy/fields.py @@ -15,7 +15,7 @@ from sqlalchemy.orm.interfaces import ONETOMANY from sqlalchemy.orm import class_mapper, Query from sqlalchemy.orm.attributes import ScalarAttributeImpl, ScalarObjectAttributeImpl, CollectionAttributeImpl -from sqlalchemy.orm.properties import CompositeProperty, ColumnProperty +from sqlalchemy.orm.properties import CompositeProperty, ColumnProperty, RelationshipProperty from sqlalchemy import exceptions as sqlalchemy_exceptions from sqlalchemy.orm import object_session from formalchemy import helpers as h @@ -830,7 +830,13 @@ def render(self, options, **kwargs): L = [(k, self.stringify_value(v)) for k, v in L] else: L = [_stringify(k) for k in L] - return h.select(self.name, self.value, L, **kwargs) + + v = self.value + if v is None and _pk(self.field.parent.model) is None: + if isinstance(self.field._property, RelationshipProperty): + v = self.field._property.local_side[0].default.arg + + return h.select(self.name, v, L, **kwargs) def render_readonly(self, options=None, **kwargs): """render a string representation of the field value. From 26e69d26d31f27d2861c2f8440d6b5d0d52a2195 Mon Sep 17 00:00:00 2001 From: Jason Date: Thu, 7 Jun 2012 14:07:39 -0400 Subject: [PATCH 2/3] Moved logic to get default relationship value into FieldRenderer's value property --- formalchemy/fields.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/formalchemy/fields.py b/formalchemy/fields.py index 6296f96..44f45ef 100644 --- a/formalchemy/fields.py +++ b/formalchemy/fields.py @@ -174,8 +174,13 @@ def value(self): return v value = self.field.model_value - if value is None: + + if value is None and _pk(self.field.parent.model) is None: + if isinstance(self.field._property, RelationshipProperty): + value = self.field._property.local_side[0].default.arg + elif value is None: return None + if self.field.is_collection: return [self.stringify_value(v) for v in value] else: @@ -831,12 +836,7 @@ def render(self, options, **kwargs): else: L = [_stringify(k) for k in L] - v = self.value - if v is None and _pk(self.field.parent.model) is None: - if isinstance(self.field._property, RelationshipProperty): - v = self.field._property.local_side[0].default.arg - - return h.select(self.name, v, L, **kwargs) + return h.select(self.name, self.value, L, **kwargs) def render_readonly(self, options=None, **kwargs): """render a string representation of the field value. From 0183c65895a5ed1bf47a4ac2e326b1f62603ce84 Mon Sep 17 00:00:00 2001 From: Jason Date: Tue, 12 Jun 2012 15:10:22 -0400 Subject: [PATCH 3/3] Added check for _property attribute before attempting to access it. --- formalchemy/fields.py | 8 ++++++-- .../de/LC_MESSAGES/formalchemy.mo | Bin 2998 -> 2998 bytes .../en/LC_MESSAGES/formalchemy.mo | Bin 3113 -> 839 bytes .../es/LC_MESSAGES/formalchemy.mo | Bin 3257 -> 3257 bytes .../fr/LC_MESSAGES/formalchemy.mo | Bin 3350 -> 3350 bytes .../ja/LC_MESSAGES/formalchemy.mo | Bin 3874 -> 3590 bytes .../pl/LC_MESSAGES/formalchemy.mo | Bin 3226 -> 3226 bytes 7 files changed, 6 insertions(+), 2 deletions(-) diff --git a/formalchemy/fields.py b/formalchemy/fields.py index 44f45ef..f9c3c1c 100644 --- a/formalchemy/fields.py +++ b/formalchemy/fields.py @@ -176,8 +176,12 @@ def value(self): value = self.field.model_value if value is None and _pk(self.field.parent.model) is None: - if isinstance(self.field._property, RelationshipProperty): - value = self.field._property.local_side[0].default.arg + if (hasattr(self.field, '_property') and + isinstance(self.field._property, RelationshipProperty)): + try: + value = self.field._property.local_side[0].default.arg + except Exception: + pass elif value is None: return None diff --git a/formalchemy/i18n_resources/de/LC_MESSAGES/formalchemy.mo b/formalchemy/i18n_resources/de/LC_MESSAGES/formalchemy.mo index f6870950d54a9ca4a1b898e5e2a6d86708fb7671..7e55a04837a4cb361c4a80e7d664952f7e0bfc8f 100644 GIT binary patch delta 14 VcmdlczD<0CDhH$KW;Kop%m5>{1R?+c delta 14 VcmdlczD<0CDhH$4W;Kop%m5?21S0?d diff --git a/formalchemy/i18n_resources/en/LC_MESSAGES/formalchemy.mo b/formalchemy/i18n_resources/en/LC_MESSAGES/formalchemy.mo index 7ce1dbc5749329eed9d9386a00f0a7d32fffa66a..cd2ec142c23764a5c0947a4d43c69490c8e60715 100644 GIT binary patch delta 272 zcmZ1}ah$FGo)F7a1|Z-CVi_QA0dbJP8z7qlh~Gl#Z&3O_l;&WB$O}SgDJZQBrFEdR zDU`N@((Vwto*@9pm=45|K+Fy_^dl3*z@I>x7072|hR_^98i*M9fCLMW7J|~^K$;E6 xmjTk8Kw23{gUrzd(jbSMLTNi7&5)a)SCSELUCh>&% zRlR=o>bzSuncYm9|I-W1ljIO;Ck?NknO(h`|p8k&_4mf zr1%Uhfu})U=Ns@I@FKVg{09ucP59`3a2$L9JOuJOFMw?SRd6eK6zm00g7{SY1a1Q_ zfNXCAlsAJtU>`UPvi%rj{bL}Sc+>aa0&hqEUC-m5Cp=Gie&u<_^PJ~-&r6b~b=)XS1gS#b~oB#v|3B zRE%roj80`^Au>_Jk+HI6$dYnm+)(65&TEr-xhZ=rnwW^%VuDg~@AmjubCv(luLtCVC>jD0}$MhdExJ5fulJB=ZRs zJFLO+1+kx&`0?(D{n+Q|?D*8w^};xvQe@$zLU3gy;df5L4_XAV;ku(w=GtK;i!tn` z8^(E^rg{kz^|tIC>6O}aA~Qpcq?N#KS8*lY|C!^EUlr9EN|D>9bnO;dF+-VNB*2nc z#Ax?06lXyqRn1Nc|3}FbK8e`~7N6oxXNl^p_3YKVgUJ=`gB%r^SR5G+hsv`$8FBTf zf)|eB?s##^A}2Y-PWD{kxs|C_vA0lYDlIc@NVDyNt7as1g=J zeIA7j$ki3+bdzE0>xm47872$s~3hrWgzGeWjIg`cW$rX%hD4FbueclWpRYG zsmeH_bR>?JC@pIfV_wBME?h82Q3mIX+`}d0Mh-q&noe^Qr2+5NR;6lnx^}pKw_Fy7 zw<-DHunhZ3wW-?VN^rt*rNre6Hz1h9Ij%~FO7KuCMPb?9Im4FRaPH=V!4*CBd!9@% zsT#Q0Dz3`Gdg4ltlOn^XG#G1F_K+` diff --git a/formalchemy/i18n_resources/es/LC_MESSAGES/formalchemy.mo b/formalchemy/i18n_resources/es/LC_MESSAGES/formalchemy.mo index a832eaf4507a16816067ad36cb01d8fd97334d1d..c74b2a399e06676f9a31ab6620b8f031999a08a2 100644 GIT binary patch delta 14 Vcmdlfxl?k(A`V8=&5Jq2SO6)S1g!u7 delta 14 Vcmdlfxl?k(A`V8g&5Jq2SO6)Y1g-!8 diff --git a/formalchemy/i18n_resources/fr/LC_MESSAGES/formalchemy.mo b/formalchemy/i18n_resources/fr/LC_MESSAGES/formalchemy.mo index 54b79919b07dc2a5c9184d6914f9f5244aca3ddc..73ac18fc853b8bb111fa4b7adda197ca2ba40522 100644 GIT binary patch delta 14 VcmbOxHBD;63Jylo%_})_SpX*>1k3;c delta 14 VcmbOxHBD;63JylI%_})_SpX*{1kC^d diff --git a/formalchemy/i18n_resources/ja/LC_MESSAGES/formalchemy.mo b/formalchemy/i18n_resources/ja/LC_MESSAGES/formalchemy.mo index ed93ba27da700049e5671e0d1cc48f74bd0cee88..a57a67ce57db648fc85c27c98a51381447db9851 100644 GIT binary patch delta 872 zcmYk)ODKd<6u|L=8Sht_$+JNzkCKI0NTG=$Wn(EjJ3@IC&8L)V>7c48X#VGK@U z94;VD)_CZ+4eQ^*6!KHdzz6diUF4}e648e_SmY8%vIrXK(8Apqk3*=1CoG>vH~BJB zOV%+OH&GYbM-Sei7lT-cZYHH;F=k=|YTb6s!5%m7pGz=H2Xo{E^Y9$C&^sn$1heun z6SZ(H>iAxy$$;fU7)d^2j+-;)lDTSbI~E+6XXcf8Yd)KA=!A%TAWgbhEdl#cUt|>Z z6KtUmFHleH4Rw6b`aiLN-0?Fg zq#Mh|GW26922eM&jk=*-^AKIqBy#o}a8%~Cd1Kz2kLHW{Y6g*OA|K|LDe+swuDR$R DsOwR? delta 1163 zcmXxj%}bO~6vy#njx*_Knwj}Bj+&ZjS(z^jOF|@EB=`>qLX;bYT)TN_6Ga4L1%?Dd z1g@+gO2~y92@6z&B#d4lT@>g>NEfB}{XLzz%y~ZNx!k$;&b?>uB%UQxMM0054QKM8 z-Hn(jy@yeJfMxg?ZIg#w7kiomhBlxqp$5K3 z9o-`K;&1H6b_$^yNAVawMb@xasEOa97FG17P|@LroxJELKP@K-s%X|)A`hR|PCzp#o>(W)NK5o#P#*i@WHiL-=GC1~KGcJe=A4d_18t=JR& s&C-opG;S%Z56U9E9v!_}D^WvmSYdsXV!EC3