1 """
2 These classes are light wrappers around Django's database API that provide
3 convenience functionality and permalink functions for the databrowse app.
4 """
5
6 from django.db import models
7 from django.utils import dateformat
8 from django.utils.text import capfirst
9 from django.utils.translation import get_date_formats
10 from django.utils.encoding import smart_unicode, smart_str, iri_to_uri
11 from django.utils.safestring import mark_safe
12 from django.db.models.query import QuerySet
13
14 EMPTY_VALUE = '(None)'
15
23
25 return '<EasyModel for %s>' % smart_str(self.model._meta.object_name)
26
28 "Returns the ModelDatabrowse class for this model."
29 return self.site.registry[self.model]
30
33
36
41
44
48
55
58
75
77 - def __init__(self, easy_model, field, value, label):
80
83
86
88 - def __init__(self, easy_model, instance):
89 self.model, self.instance = easy_model, instance
90
93
95 val = smart_unicode(self.instance)
96 if len(val) > 30:
97 return val[:30] + u'...'
98 return val
99
102
105
108
116
132
134 - def __init__(self, easy_model, instance, field):
135 self.model, self.field, self.instance = easy_model, field, instance
136 self.raw_value = getattr(instance.instance, field.name)
137
140
142 """
143 Returns a list of values for this field for this instance. It's a list
144 so we can accomodate many-to-many fields.
145 """
146
147
148
149 if self.field.rel:
150 if isinstance(self.field.rel, models.ManyToOneRel):
151 objs = getattr(self.instance.instance, self.field.name)
152 elif isinstance(self.field.rel, models.ManyToManyRel):
153 return list(getattr(self.instance.instance, self.field.name).all())
154 elif self.field.choices:
155 objs = dict(self.field.choices).get(self.raw_value, EMPTY_VALUE)
156 elif isinstance(self.field, models.DateField) or isinstance(self.field, models.TimeField):
157 if self.raw_value:
158 date_format, datetime_format, time_format = get_date_formats()
159 if isinstance(self.field, models.DateTimeField):
160 objs = capfirst(dateformat.format(self.raw_value, datetime_format))
161 elif isinstance(self.field, models.TimeField):
162 objs = capfirst(dateformat.time_format(self.raw_value, time_format))
163 else:
164 objs = capfirst(dateformat.format(self.raw_value, date_format))
165 else:
166 objs = EMPTY_VALUE
167 elif isinstance(self.field, models.BooleanField) or isinstance(self.field, models.NullBooleanField):
168 objs = {True: 'Yes', False: 'No', None: 'Unknown'}[self.raw_value]
169 else:
170 objs = self.raw_value
171 return [objs]
172
174 "Returns a list of (value, URL) tuples."
175
176 plugin_urls = []
177 for plugin_name, plugin in self.model.model_databrowse().plugins.items():
178 urls = plugin.urls(plugin_name, self)
179 if urls is not None:
180
181 values = self.values()
182 return zip(self.values(), urls)
183 if self.field.rel:
184 m = EasyModel(self.model.site, self.field.rel.to)
185 if self.field.rel.to in self.model.model_list:
186 lst = []
187 for value in self.values():
188 url = mark_safe('%s%s/%s/objects/%s/' % (self.model.site.root_url, m.model._meta.app_label, m.model._meta.module_name, iri_to_uri(value._get_pk_val())))
189 lst.append((smart_unicode(value), url))
190 else:
191 lst = [(value, None) for value in self.values()]
192 elif self.field.choices:
193 lst = []
194 for value in self.values():
195 url = mark_safe('%s%s/%s/fields/%s/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name, self.field.name, iri_to_uri(self.raw_value)))
196 lst.append((value, url))
197 elif isinstance(self.field, models.URLField):
198 val = self.values()[0]
199 lst = [(val, iri_to_uri(val))]
200 else:
201 lst = [(self.values()[0], None)]
202 return lst
203
205 """
206 When creating (or cloning to) an `EasyQuerySet`, make sure to set the
207 `_easymodel` variable to the related `EasyModel`.
208 """
212
213 - def _clone(self, *args, **kwargs):
217