le 28.06.2007 11:15 remi jolin a écrit:
> le 25.06.2007 21:58 Gaetan de Menten a écrit:
>   
>> Well... If it was so simple, I'd have done it already. As I said, you
>> need to take into account tthe args and kwargs defined on the inverse
>> (and also prevent that inverse to setup the property too). I'll have a
>> look at the test thing tomorrow.
>>
>>   
>>     
> Gaetan,
> Here is my second version. I made the changes to do plain "backref" 
> calls. It passes all the tests (as I sent last time)
>
> Here is the patch, I think it looks like more to what you were looking for :
>
>   
while re-reading the code again I realized that, for a given 
RelationShip, there could only be one backref so _backrefs had not to be 
a dict...

So here is the new patch :

Index: elixir/relationships.py
===================================================================
--- elixir/relationships.py     (révision 135)
+++ elixir/relationships.py     (copie de travail)
@@ -190,7 +190,7 @@
 '''

 from sqlalchemy         import relation, ForeignKeyConstraint, Column, \
-                               Table, and_
+                               Table, and_, backref
 from elixir.statements  import Statement
 from elixir.fields      import Field
 from elixir.entity      import EntityDescriptor
@@ -205,6 +205,8 @@
     '''

     def __init__(self, entity, name, *args, **kwargs):
+        print self.__class__.__name__, "init", args, kwargs
+
         self.entity = entity
         self.name = name
         self.of_kind = kwargs.pop('of_kind')
@@ -218,6 +220,9 @@
         #TODO: unused for now
         self.args = args
         self.kwargs = kwargs
+
+        self._backref = None # to handle backref definitions
+        self._setup_done = False

         self.entity._descriptor.relationships[self.name] = self

@@ -243,13 +248,17 @@
         '''
         Sets up the relationship, creates foreign keys and secondary 
tables.
         '''
-
+
         if not self.target:
             return False

         if self.property:
             return True

+        if self._setup_done:
+            return True
+        self._setup_done = True
+
         self.create_keys()
         self.create_tables()
         self.create_properties()
@@ -447,7 +456,16 @@
         if self.primaryjoin_clauses:
             kwargs['primaryjoin'] = and_(*self.primaryjoin_clauses)
         kwargs['uselist'] = False
-
+
+        if self.inverse:
+            # check if backref is already defined on the other side
+            if self.inverse._backref:
+                kwargs['backref'] = self.inverse._backref
+            else:
+                # define backref for further use
+                self._backref = backref(self.name, **kwargs)
+                return
+
         self.property = relation(self.target, **kwargs)
         self.entity.mapper.add_property(self.name, self.property)

@@ -488,8 +506,14 @@

         kwargs['uselist'] = self.uselist

-        self.property = relation(self.target, **kwargs)
-        self.entity.mapper.add_property(self.name, self.property)
+        # has_one and has_many always have inverse...
+        if self.inverse._backref:
+            kwargs['backref'] = self.inverse._backref
+            self.property = relation(self.target, **kwargs)
+            self.entity.mapper.add_property(self.name, self.property)
+        else:
+            # define backref for further use
+            self._backref = backref(self.name, **kwargs)


 class HasMany(HasOne):
@@ -517,7 +541,7 @@
         self.secondary_table = None
         self.primaryjoin_clauses = list()
         self.secondaryjoin_clauses = list()
-        super(HasAndBelongsToMany, self).__init__(entity, name,
+        super(HasAndBelongsToMany, self).__init__(entity, name,
                                                   *args, **kwargs)

     def create_tables(self):
@@ -660,6 +684,15 @@
             kwargs['order_by'] = \
                 
self.target._descriptor.translate_order_by(kwargs['order_by'])

+        if self.inverse:
+            # check if backref is already defined on the other side
+            if self.inverse._backref:
+                kwargs['backref'] = self.inverse._backref
+            else:
+                # define backref for further use
+                self._backref = backref(self.name, **kwargs)
+                return
+
         self.property = relation(self.target, 
secondary=self.secondary_table,
                                  uselist=True, **kwargs)
         self.entity.mapper.add_property(self.name, self.property)

>   

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"SQLElixir" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlelixir?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to