Add new "v3" grids, refactor all views to use them
or at least that's the idea..hopefully we caught them all
This commit is contained in:
parent
f244c2934b
commit
5b1ae27a10
71 changed files with 2679 additions and 2030 deletions
tailbone/views
|
@ -28,6 +28,7 @@ from __future__ import unicode_literals, absolute_import
|
|||
|
||||
import json
|
||||
import pytz
|
||||
import six
|
||||
|
||||
from rattail import enum
|
||||
from rattail.db import model
|
||||
|
@ -40,16 +41,8 @@ from webhelpers2.html import tags, HTML
|
|||
|
||||
from tailbone import forms
|
||||
from tailbone.db import Session
|
||||
from tailbone.views import MasterView
|
||||
|
||||
|
||||
class SubjectFieldRenderer(formalchemy.FieldRenderer):
|
||||
|
||||
def render_readonly(self, **kwargs):
|
||||
subject = self.raw_value
|
||||
if not subject:
|
||||
return ''
|
||||
return tags.link_to(subject, self.request.route_url('messages.view', uuid=self.field.parent.model.uuid))
|
||||
from tailbone.views import MasterView2 as MasterView
|
||||
from tailbone.util import raw_datetime
|
||||
|
||||
|
||||
class SenderFieldRenderer(forms.renderers.UserFieldRenderer):
|
||||
|
@ -106,23 +99,6 @@ class RecipientsFieldRenderer(formalchemy.FieldRenderer):
|
|||
return ', '.join(recips)
|
||||
|
||||
|
||||
class TerseRecipientsFieldRenderer(formalchemy.FieldRenderer):
|
||||
|
||||
def render_readonly(self, **kwargs):
|
||||
recipients = self.raw_value
|
||||
if not recipients:
|
||||
return ''
|
||||
message = self.field.parent.model
|
||||
recips = [r for r in recipients if r.recipient is not self.request.user]
|
||||
recips = sorted([r.recipient.display_name for r in recips])
|
||||
if len(recips) < len(recipients) and (
|
||||
message.sender is not self.request.user or not recips):
|
||||
recips.insert(0, 'you')
|
||||
if len(recips) < 5:
|
||||
return ', '.join(recips)
|
||||
return "{}, ...".format(', '.join(recips[:4]))
|
||||
|
||||
|
||||
class MessagesView(MasterView):
|
||||
"""
|
||||
Base class for message views.
|
||||
|
@ -133,6 +109,7 @@ class MessagesView(MasterView):
|
|||
checkboxes = True
|
||||
replying = False
|
||||
reply_header_sent_format = '%a %d %b %Y at %I:%M %p'
|
||||
grid_columns = ['subject', 'sender', 'recipients', 'sent']
|
||||
|
||||
def get_index_title(self):
|
||||
if self.listing:
|
||||
|
@ -176,37 +153,49 @@ class MessagesView(MasterView):
|
|||
.outerjoin(model.MessageRecipient)\
|
||||
.filter(model.MessageRecipient.recipient == self.request.user)
|
||||
|
||||
def _preconfigure_grid(self, g):
|
||||
def configure_grid(self, g):
|
||||
|
||||
g.joiners['sender'] = lambda q: q.join(model.User, model.User.uuid == model.Message.sender_uuid).outerjoin(model.Person)
|
||||
g.filters['sender'] = g.make_filter('sender', model.Person.display_name,
|
||||
default_active=True, default_verb='contains')
|
||||
g.sorters['sender'] = g.make_sorter(model.Person.display_name)
|
||||
g.sender.set(label="From", renderer=SenderFieldRenderer)
|
||||
|
||||
g.filters['subject'].default_active = True
|
||||
g.filters['subject'].default_verb = 'contains'
|
||||
g.subject.set(renderer=SubjectFieldRenderer)
|
||||
|
||||
g.recipients.set(label="To", renderer=TerseRecipientsFieldRenderer)
|
||||
|
||||
g.default_sortkey = 'sent'
|
||||
g.default_sortdir = 'desc'
|
||||
|
||||
def configure_grid(self, g):
|
||||
g.configure(
|
||||
include=[
|
||||
g.subject,
|
||||
g.sender,
|
||||
g.recipients,
|
||||
g.sent,
|
||||
],
|
||||
readonly=True)
|
||||
g.set_renderer('sent', self.render_sent)
|
||||
g.set_renderer('sender', self.render_sender)
|
||||
g.set_renderer('recipients', self.render_recipients)
|
||||
|
||||
def row_attrs(self, row, i):
|
||||
recip = self.get_recipient(row)
|
||||
if recip:
|
||||
return {'data-uuid': recip.uuid}
|
||||
return {}
|
||||
g.set_link('subject')
|
||||
|
||||
g.set_label('sender', "From")
|
||||
g.set_label('recipients', "To")
|
||||
|
||||
def render_sent(self, message, column_name):
|
||||
return raw_datetime(self.rattail_config, message.sent)
|
||||
|
||||
def render_sender(self, message, column_name):
|
||||
sender = message.sender
|
||||
if sender is self.request.user:
|
||||
return 'you'
|
||||
return six.text_type(sender)
|
||||
|
||||
def render_recipients(self, message, column_name):
|
||||
recipients = message.recipients
|
||||
if recipients:
|
||||
recips = [r for r in recipients if r.recipient is not self.request.user]
|
||||
recips = sorted([r.recipient.display_name for r in recips])
|
||||
if len(recips) < len(recipients) and (
|
||||
message.sender is not self.request.user or not recips):
|
||||
recips.insert(0, "you")
|
||||
if len(recips) < 5:
|
||||
return ", ".join(recips)
|
||||
return "{}, ...".format(', '.join(recips[:4]))
|
||||
return ""
|
||||
|
||||
def make_form(self, instance, **kwargs):
|
||||
form = super(MessagesView, self).make_form(instance, **kwargs)
|
||||
|
@ -398,10 +387,12 @@ class MessagesView(MasterView):
|
|||
if uuids:
|
||||
new_status = enum.MESSAGE_STATUS_INBOX if dest == 'inbox' else enum.MESSAGE_STATUS_ARCHIVE
|
||||
for uuid in uuids:
|
||||
recip = Session.query(model.MessageRecipient).get(uuid) if uuid else None
|
||||
if recip and recip.recipient is self.request.user:
|
||||
if recip.status != new_status:
|
||||
recip.status = new_status
|
||||
recip = self.Session.query(model.MessageRecipient)\
|
||||
.filter(model.MessageRecipient.message_uuid == uuid)\
|
||||
.filter(model.MessageRecipient.recipient_uuid == self.request.user.uuid)\
|
||||
.first()
|
||||
if recip and recip.status != new_status:
|
||||
recip.status = new_status
|
||||
route = 'messages.{}'.format('archive' if dest == 'inbox' else 'inbox')
|
||||
return self.redirect(self.request.route_url(route))
|
||||
|
||||
|
@ -480,8 +471,8 @@ class SentView(MessagesView):
|
|||
return session.query(model.Message)\
|
||||
.filter(model.Message.sender == self.request.user)
|
||||
|
||||
def _preconfigure_grid(self, g):
|
||||
super(SentView, self)._preconfigure_grid(g)
|
||||
def configure_grid(self, g):
|
||||
super(SentView, self).configure_grid(g)
|
||||
g.filters['sender'].default_active = False
|
||||
g.joiners['recipients'] = lambda q: q.join(model.MessageRecipient)\
|
||||
.join(model.User, model.User.uuid == model.MessageRecipient.recipient_uuid)\
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue