|
|
|
@ -0,0 +1,96 @@
|
|
|
|
|
from django.views.generic import list
|
|
|
|
|
from django.db.models import Q
|
|
|
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import models
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
__all__ = ('JournalFilterMixin', 'JournalPrefetchMixin',
|
|
|
|
|
'JournalContextDataMixin', 'JournalView', 'FilteredJournalView')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def common_prefix(str1, str2):
|
|
|
|
|
min_len = min(len(str1), len(str2))
|
|
|
|
|
for i in range(min_len):
|
|
|
|
|
if str1[i] != str2[i]:
|
|
|
|
|
return str1[:i]
|
|
|
|
|
return str1[:min_len]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class JournalFilterMixin(object):
|
|
|
|
|
filter_param = 'object_filter'
|
|
|
|
|
|
|
|
|
|
def get_queryset(self):
|
|
|
|
|
queryset = super(JournalFilterMixin, self).get_queryset()
|
|
|
|
|
filters = []
|
|
|
|
|
for object_filter in self.request.GET.get(self.filter_param, ()):
|
|
|
|
|
object_filter = object_filter.split(',')
|
|
|
|
|
if len(object_filter) != 2:
|
|
|
|
|
continue
|
|
|
|
|
content_type_id, object_id = object_filter
|
|
|
|
|
filters.append(Q(objectdata_set__content_type__id=content_type_id,
|
|
|
|
|
objectdata_set__object_id=object_id))
|
|
|
|
|
if filters:
|
|
|
|
|
queryset = queryset.filter(reduce(Q.__or__, filters))
|
|
|
|
|
return queryset
|
|
|
|
|
|
|
|
|
|
def get_message(self, obj):
|
|
|
|
|
ctx = obj.message_context()
|
|
|
|
|
for obj_data in obj.objectdata_set.select_related():
|
|
|
|
|
content_type_id = obj_data.content_type.id;
|
|
|
|
|
object_id = obj_data.object_id;
|
|
|
|
|
key = obj_data.tag.name;
|
|
|
|
|
qd = self.request.GET.copy()
|
|
|
|
|
qd.appendlist(self.filter_param,
|
|
|
|
|
'{0},{1}'.format(content_type_id, object_id))
|
|
|
|
|
url = '?{0}'.format(qd)
|
|
|
|
|
ctx[key] = u'<a href="{url}">{label}</a>'.format(url, ctx[key])
|
|
|
|
|
template = _(obj.template_content) # localize the template
|
|
|
|
|
return '<span>{}</span>'.format(template.format(**ctx))
|
|
|
|
|
|
|
|
|
|
def get_context_data(self, **kwargs):
|
|
|
|
|
context = super(JournalFilterMixin, self).get_context_data(**kwargs)
|
|
|
|
|
object_list = context['object_list']
|
|
|
|
|
for obj in object_list:
|
|
|
|
|
obj.message = self.get_message(obj)
|
|
|
|
|
return context
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class JournalPrefetchMixin(object):
|
|
|
|
|
def get_queryset(self):
|
|
|
|
|
queryset = super(JournalPrefetchMixin, self).get_queryset()
|
|
|
|
|
queryset = queryset.select_related('tag', 'template') \
|
|
|
|
|
.prefetch_related('objectdata_set__content_type', 'stringdata_set',
|
|
|
|
|
'objectdata_set__tag', 'objectdata_set__content_object')
|
|
|
|
|
return queryset
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def JournalSimplifyTimeDataMixin(object):
|
|
|
|
|
def get_context_data(self, **kwargs):
|
|
|
|
|
context = super(JournalSimplifyTimeDataMixin, self).get_context_data(**kwargs)
|
|
|
|
|
object_list = context['object_list']
|
|
|
|
|
previous_datetime = ''
|
|
|
|
|
for obj in object_list:
|
|
|
|
|
current_datetime = unicode(obj.time)
|
|
|
|
|
prefix = common_prefix(previous_datetime, current_datetime)
|
|
|
|
|
previous_datetime = current_datetime
|
|
|
|
|
current_datetime = current_datetime[len(prefix):]
|
|
|
|
|
i = current_datetime.find('-')
|
|
|
|
|
if i != -1:
|
|
|
|
|
current_datetime = current_datetime[i+1:]
|
|
|
|
|
else:
|
|
|
|
|
j = current_datetime.find(':')
|
|
|
|
|
if j != -1:
|
|
|
|
|
current_datetime = current_datetime[j+1:]
|
|
|
|
|
obj.time = current_datetime
|
|
|
|
|
return context
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class JournalView(JournalPrefetchMixin, JournalSimplifyTimeDataMixin, list.ListView):
|
|
|
|
|
model = models.Journal
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FilteredJournalView(JournalPrefetchMixin, JournalFilterMixin,
|
|
|
|
|
JournalSimplifyTimeDataMixin, list.ListView):
|
|
|
|
|
model = models.Journal
|