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 :

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._backrefs = dict() # 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._backrefs.get(self.inverse.name, None):
+                kwargs['backref'] = 
self.inverse._backrefs[self.inverse.name]
+            else:
+                # define backref for further use
+                self._backrefs[self.name] = 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._backrefs.get(self.inverse.name, None):
+            kwargs['backref'] = self.inverse._backrefs[self.inverse.name]
+            self.property = relation(self.target, **kwargs)
+            self.entity.mapper.add_property(self.name, self.property)
+        else:
+            # define backref for further use
+            self._backrefs[self.name] = 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._backrefs.get(self.inverse.name, None):
+                kwargs['backref'] = 
self.inverse._backrefs[self.inverse.name]
+            else:
+                # define backref for further use
+                self._backrefs[self.name] = 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