rtags.py
branchstable
changeset 2369 5a2b8ed266ca
parent 1977 606923dff11b
child 2689 44f041222d0f
equal deleted inserted replaced
2368:b41aef0e63a7 2369:5a2b8ed266ca
    99         if self._allowed_values is not None:
    99         if self._allowed_values is not None:
   100             assert tag in self._allowed_values, \
   100             assert tag in self._allowed_values, \
   101                    '%r is not an allowed tag (should be in %s)' % (
   101                    '%r is not an allowed tag (should be in %s)' % (
   102                 tag, self._allowed_values)
   102                 tag, self._allowed_values)
   103         self._tagdefs[(rtype, tagged, stype, otype)] = tag
   103         self._tagdefs[(rtype, tagged, stype, otype)] = tag
       
   104         return tag
   104 
   105 
   105     # rtag runtime api ########################################################
   106     # rtag runtime api ########################################################
   106 
   107 
   107     def del_rtag(self, stype, rtype, otype, tagged):
   108     def del_rtag(self, stype, rtype, otype, tagged):
   108         del self._tagdefs[(rtype, tagged, stype, otype)]
   109         del self._tagdefs[(rtype, tagged, stype, otype)]
   121         return self.get(ttype, rtype, etype, role)
   122         return self.get(ttype, rtype, etype, role)
   122 
   123 
   123 
   124 
   124 
   125 
   125 class RelationTagsSet(RelationTags):
   126 class RelationTagsSet(RelationTags):
   126     """This class associates a set of tags to each key."""
   127     """This class associates a set of tags to each key.
       
   128     """
       
   129     tag_container_cls = set
   127 
   130 
   128     def tag_relation(self, key, tag):
   131     def tag_relation(self, key, tag):
   129         stype, rtype, otype, tagged = [str(k) for k in key]
   132         stype, rtype, otype, tagged = [str(k) for k in key]
   130         rtags = self._tagdefs.setdefault((rtype, tagged, stype, otype), set())
   133         rtags = self._tagdefs.setdefault((rtype, tagged, stype, otype),
       
   134                                          self.tag_container_cls())
   131         rtags.add(tag)
   135         rtags.add(tag)
       
   136         return rtags
   132 
   137 
   133     def get(self, stype, rtype, otype, tagged):
   138     def get(self, stype, rtype, otype, tagged):
   134         rtags = set()
   139         rtags = self.tag_container_cls()
   135         for key in self._get_keys(stype, rtype, otype, tagged):
   140         for key in self._get_keys(stype, rtype, otype, tagged):
   136             try:
   141             try:
   137                 rtags.update(self._tagdefs[key])
   142                 rtags.update(self._tagdefs[key])
   138             except KeyError:
   143             except KeyError:
   139                 continue
   144                 continue
   140         return rtags
   145         return rtags
   141 
   146 
   142 
   147 
       
   148 class RelationTagsDict(RelationTagsSet):
       
   149     """This class associates a set of tags to each key."""
       
   150     tag_container_cls = dict
       
   151 
       
   152     def tag_relation(self, key, tag):
       
   153         stype, rtype, otype, tagged = [str(k) for k in key]
       
   154         try:
       
   155             rtags = self._tagdefs[(rtype, tagged, stype, otype)]
       
   156             rtags.update(tag)
       
   157             return rtags
       
   158         except KeyError:
       
   159             self._tagdefs[(rtype, tagged, stype, otype)] = tag
       
   160             return tag
       
   161 
       
   162     def setdefault(self, key, tagkey, tagvalue):
       
   163         stype, rtype, otype, tagged = [str(k) for k in key]
       
   164         try:
       
   165             rtags = self._tagdefs[(rtype, tagged, stype, otype)]
       
   166             rtags.setdefault(tagkey, tagvalue)
       
   167             return rtags
       
   168         except KeyError:
       
   169             self._tagdefs[(rtype, tagged, stype, otype)] = {tagkey: tagvalue}
       
   170             return self._tagdefs[(rtype, tagged, stype, otype)]
       
   171 
       
   172 
   143 class RelationTagsBool(RelationTags):
   173 class RelationTagsBool(RelationTags):
   144     _allowed_values = frozenset((True, False))
   174     _allowed_values = frozenset((True, False))
   145 
   175 
   146 
   176 
   147 set_log_methods(RelationTags, logging.getLogger('cubicweb.rtags'))
   177 set_log_methods(RelationTags, logging.getLogger('cubicweb.rtags'))