2
2
These classes are light wrappers around Django's database API that provide
3
3
convenience functionality and permalink functions for the databrowse app.
5
from __future__ import unicode_literals
6
7
from django.db import models
7
8
from django.utils import formats
8
9
from django.utils.text import capfirst
9
from django.utils.encoding import smart_unicode, smart_str, iri_to_uri
10
from django.utils.safestring import mark_safe
10
from django.utils.encoding import smart_text, force_str, iri_to_uri
11
11
from django.db.models.query import QuerySet
12
from django.utils.encoding import python_2_unicode_compatible
13
14
EMPTY_VALUE = '(None)'
17
18
def __init__(self, site, model):
20
self.model_list = site.registry.keys()
21
self.model_list = list(site.registry.keys())
21
22
self.verbose_name = model._meta.verbose_name
22
23
self.verbose_name_plural = model._meta.verbose_name_plural
24
25
def __repr__(self):
25
return '<EasyModel for %s>' % smart_str(self.model._meta.object_name)
26
return force_str('<EasyModel for %s>' % self.model._meta.object_name)
27
28
def model_databrowse(self):
28
29
"Returns the ModelDatabrowse class for this model."
29
30
return self.site.registry[self.model]
32
return mark_safe('%s%s/%s/' % (self.site.root_url, self.model._meta.app_label, self.model._meta.module_name))
33
return '%s%s/%s/' % (self.site.root_url, self.model._meta.app_label, self.model._meta.module_name)
34
35
def objects(self, **kwargs):
35
36
return self.get_query_set().filter(**kwargs)
61
62
self.model, self.field = easy_model, field
63
64
def __repr__(self):
64
return smart_str(u'<EasyField for %s.%s>' % (self.model.model._meta.object_name, self.field.name))
65
return force_str('<EasyField for %s.%s>' % (self.model.model._meta.object_name, self.field.name))
67
68
for value, label in self.field.choices:
71
72
if self.field.choices:
72
return mark_safe('%s%s/%s/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name, self.field.name))
73
return '%s%s/%s/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name, self.field.name)
73
74
elif self.field.rel:
74
return mark_safe('%s%s/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name))
75
return '%s%s/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name)
76
77
class EasyChoice(object):
77
78
def __init__(self, easy_model, field, value, label):
79
80
self.value, self.label = value, label
81
82
def __repr__(self):
82
return smart_str(u'<EasyChoice for %s.%s>' % (self.model.model._meta.object_name, self.field.name))
83
return force_str('<EasyChoice for %s.%s>' % (self.model.model._meta.object_name, self.field.name))
85
return mark_safe('%s%s/%s/%s/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name, self.field.field.name, iri_to_uri(self.value)))
86
return '%s%s/%s/%s/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name, self.field.field.name, iri_to_uri(self.value))
88
@python_2_unicode_compatible
87
89
class EasyInstance(object):
88
90
def __init__(self, easy_model, instance):
89
91
self.model, self.instance = easy_model, instance
91
93
def __repr__(self):
92
return smart_str(u'<EasyInstance for %s (%s)>' % (self.model.model._meta.object_name, self.instance._get_pk_val()))
94
return force_str('<EasyInstance for %s (%s)>' % (self.model.model._meta.object_name, self.instance._get_pk_val()))
94
def __unicode__(self):
95
val = smart_unicode(self.instance)
97
val = smart_text(self.instance)
96
98
if len(val) > DISPLAY_SIZE:
97
return val[:DISPLAY_SIZE] + u'...'
99
return val[:DISPLAY_SIZE] + '...'
101
return self.__unicode__().encode('utf-8')
104
103
return self.instance._get_pk_val()
107
return mark_safe('%s%s/%s/objects/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name, iri_to_uri(self.pk())))
106
return '%s%s/%s/objects/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name, iri_to_uri(self.pk()))
109
108
def fields(self):
136
135
self.raw_value = getattr(instance.instance, field.name)
138
137
def __repr__(self):
139
return smart_str(u'<EasyInstanceField for %s.%s>' % (self.model.model._meta.object_name, self.field.name))
138
return force_str('<EasyInstanceField for %s.%s>' % (self.model.model._meta.object_name, self.field.name))
141
140
def values(self):
176
175
for plugin_name, plugin in self.model.model_databrowse().plugins.items():
177
176
urls = plugin.urls(plugin_name, self)
178
177
if urls is not None:
179
#plugin_urls.append(urls)
180
values = self.values()
181
178
return zip(self.values(), urls)
182
179
if self.field.rel:
183
180
m = EasyModel(self.model.site, self.field.rel.to)
186
183
for value in self.values():
187
184
if value is None:
189
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())))
190
lst.append((smart_unicode(value), url))
186
url = '%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()))
187
lst.append((smart_text(value), url))
192
189
lst = [(value, None) for value in self.values()]
193
190
elif self.field.choices:
195
192
for value in self.values():
196
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)))
193
url = '%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))
197
194
lst.append((value, url))
198
195
elif isinstance(self.field, models.URLField):
199
val = self.values()[0]
196
val = list(self.values())[0]
200
197
lst = [(val, iri_to_uri(val))]
202
lst = [(self.values()[0], None)]
199
lst = [(list(self.values())[0], None)]
205
202
class EasyQuerySet(QuerySet):