Source code for mep.accounts.views

import datetime
from collections import defaultdict, OrderedDict

from dal import autocomplete
from dateutil.relativedelta import relativedelta
from django.contrib.auth.mixins import LoginRequiredMixin
from django.db.models import Q
from django.views.generic import ListView

from mep.accounts.models import Account, Event
from mep.accounts.partial_date import DatePrecision


[docs]class AccountAutocomplete(autocomplete.Select2QuerySetView): '''Basic autocomplete lookup, for use with django-autocomplete-light and :class:`mep.accounts.models.Account` in address many-to-many'''
[docs] def get_queryset(self): '''Get a queryset filtered by query string. Searches on account id, people associated with account, and addresses associated with account ''' return Account.objects.filter( Q(id__contains=self.q) | Q(persons__name__icontains=self.q) | Q(persons__mep_id__icontains=self.q) | Q(locations__name__icontains=self.q) | Q(locations__street_address__icontains=self.q) | Q(locations__city__icontains=self.q) ).distinct().order_by('id')
[docs]class Twitter100yearsReview(LoginRequiredMixin, ListView): '''Admin view to review upcoming 100 years tweets before they are posted on twitter. Finds and displays tweets for events in the next three months, using the same logic for generating tweet content that the twitter bot manage command uses. ''' model = Event template_name = 'accounts/100years_twitter_review.html' full_precision = DatePrecision.year | DatePrecision.month | \ DatePrecision.day
[docs] def get_date_range(self): '''Determine start and end date for events to review. Start 100 years before today, end 4 weeks after that.''' # determine date exactly 100 years earlier self.date_start = datetime.date.today() - relativedelta(years=100) # determine end date for tweets to review self.date_end = self.date_start + relativedelta(months=3) return self.date_start, self.date_end
[docs] def get_queryset(self): date_start, date_end = self.get_date_range() events = Event.objects \ .filter(Q(start_date__gte=date_start, start_date__lte=date_end) | Q(subscription__purchase_date__gte=date_start, subscription__purchase_date__lte=date_end) | Q(borrow__isnull=False, end_date__gte=date_start, end_date__lte=date_end)) \ .filter(Q(start_date_precision__isnull=True) | Q(start_date_precision=int(self.full_precision))) \ .exclude(work__notes__contains="UNCERTAINTYICON") return events
[docs] def get_context_data(self): context = super().get_context_data() # construct a dictionary of dates with a list of events, # to make it easy to display all tweets in order events_by_date = defaultdict(list) for ev in self.object_list: if ev.event_label in ['Subscription', 'Renewal']: events_by_date[ ev.subscription.partial_purchase_date].append(ev) elif ev.event_label == 'Borrow': events_by_date[ev.partial_start_date].append(ev) events_by_date[ev.partial_end_date].append(ev) else: events_by_date[ev.partial_start_date].append(ev) # could include None for unset dates; remove without error events_by_date.pop(None, None) # convert to a standard dict to avoid problems with django templates; # sort by date & converted to ordered dict so review will be sequential # filter out any dates before the current range date_start_iso = self.date_start.isoformat() date_end_iso = self.date_end.isoformat() events_by_date = OrderedDict([ (k, events_by_date[k]) for k in sorted(events_by_date) if k and date_start_iso <= k <= date_end_iso]) context['events_by_date'] = events_by_date return context