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')) |