class StaffPhoneReadView(BreadLabelValueReadView): fields = ( (get_verbose_name(StaffPhone, 'phone_number'), 'formatted_phone_number_tag'), (get_verbose_name(StaffPhone, 'registration_center'), 'registration_center_as_html'), (get_verbose_name(StaffPhone, 'creation_date'), 'formatted_creation_date'), (get_verbose_name(StaffPhone, 'modification_date'), 'formatted_modification_date'), )
class SubscriptionRead(LabelValueReadView): fields = [ (_('User'), 'user'), (_('Type of subscription'), 'get_subscription_type_display'), (get_verbose_name(Subscription, 'creation_date'), 'formatted_creation_date'), (get_verbose_name(Subscription, 'modification_date'), 'formatted_modification_date'), ]
class CenterClosedForElectionBrowse(PaginatedBrowseView): columns = ( (get_verbose_name(CenterClosedForElection, 'election'), 'election'), (get_verbose_name(CenterClosedForElection, 'registration_center'), 'registration_center'), ) filterset = CenterClosedForElectionFilterSet
class RegistrationBrowse(PaginatedBrowseView): filterset = RegistrationFilterSet queryset = get_registration_bread_queryset() columns = ( (get_verbose_name(Citizen, 'national_id'), 'citizen__national_id'), (get_verbose_name(Registration, 'citizen'), 'citizen', False), (get_verbose_name(Registration, 'registration_center'), 'registration_center'), (get_verbose_name(Registration, 'archive_time'), 'formatted_archive_time'), ) search_fields = ('citizen__national_id', 'citizen__first_name', 'citizen__father_name', 'citizen__grandfather_name', 'citizen__family_name') search_terms = _('national ID, first name, father name, grandfather name, family name ') def get_queryset(self, *args, **kwargs): queryset = super(RegistrationBrowse, self).get_queryset(*args, **kwargs) if not queryset.ordered: queryset = queryset.order_by('registration_center__center_id', '-modification_date') # else: # The queryset is already ordered according to the user's preference. # Fetch related entities in a single query rather than executing 1 query for each related # enitity for each registration. queryset = queryset.select_related('citizen', 'registration_center') return queryset
class RegistrationPeriodReadView(LabelValueReadView): fields = ( (get_verbose_name(RegistrationPeriod, 'start_time'), 'formatted_start_time'), (get_verbose_name(RegistrationPeriod, 'end_time'), 'formatted_end_time'), (get_verbose_name(RegistrationPeriod, 'creation_date'), 'formatted_creation_date'), (get_verbose_name(RegistrationPeriod, 'modification_date'), 'formatted_modification_date'), )
class CandidateRead(LabelValueReadView): fields = ((None, 'name_arabic'), (None, 'name_english'), (None, 'candidate_number'), (get_verbose_name(Candidate, 'ballot'), 'ballot_as_html'), (get_verbose_name(Candidate, 'creation_date'), 'formatted_creation_date'), (get_verbose_name(Candidate, 'modification_date'), 'formatted_modification_date'), )
class SubconstituencyReadView(BreadLabelValueReadView): """Semi-custom view for subcon read view""" fields = [ (None, 'id'), (None, 'name_english'), (None, 'name_arabic'), (get_verbose_name(SubConstituency, 'creation_date'), 'formatted_creation_date'), (get_verbose_name(SubConstituency, 'modification_date'), 'formatted_modification_date'), ]
class CenterOpenBrowse(PaginatedBrowseView): columns = ( (get_verbose_name(CenterOpen, 'election'), 'election'), (get_verbose_name(CenterOpen, 'creation_date'), 'formatted_creation_date', 'creation_date'), (get_verbose_name(CenterOpen, 'registration_center'), 'registration_center'), ) filterset = CenterOpenFilterSet
class ElectionReadView(LoginPermissionRequiredMixin, LabelValueReadView): permission_required = "voting.read_election" fields = ((None, 'name_english'), (None, 'name_arabic'), (get_verbose_name(Election, 'polling_start_time'), 'formatted_polling_start_time'), (get_verbose_name(Election, 'polling_end_time'), 'formatted_polling_end_time'), (get_verbose_name(Election, 'creation_date'), 'formatted_creation_date'), (get_verbose_name(Election, 'modification_date'), 'formatted_modification_date'), )
class BallotReadView(LabelValueReadView): fields = ((get_verbose_name(Ballot, 'election'), 'election_as_html'), (get_verbose_name(Ballot, 'subconstituencies'), 'subconstituencies_as_html'), (None, 'internal_ballot_number'), (get_verbose_name(Ballot, 'ballot_type'), 'get_ballot_type_display'), (None, 'num_seats'), (get_verbose_name(Ballot, 'creation_date'), 'formatted_creation_date'), (get_verbose_name(Ballot, 'modification_date'), 'formatted_modification_date'), )
class WhitelistedNumberBrowse(PaginatedBrowseView): columns = [ (get_verbose_name(Whitelist, 'phone_number'), 'formatted_phone_number_tag', 'phone_number'), (get_verbose_name(Whitelist, 'creation_date'), 'formatted_creation_date', 'creation_date'), (get_verbose_name(Whitelist, 'modification_date'), 'formatted_modification_date', 'modification_date'), ] search_fields = ('phone_number', ) search_terms = _('Phone Number')
class OfficeReadView(BreadLabelValueReadView): """Semi-custom view for office read view""" fields = [ (None, 'id'), (None, 'name_english'), (None, 'name_arabic'), (get_verbose_name(Office, 'region'), 'region_name'), (get_verbose_name(Office, 'creation_date'), 'formatted_creation_date'), (get_verbose_name(Office, 'modification_date'), 'formatted_modification_date'), ]
class PollingReportBrowse(PaginatedBrowseView): columns = ( (get_verbose_name(PollingReport, 'election'), 'election'), (get_verbose_name(PollingReport, 'phone_number'), 'formatted_phone_number_tag'), (get_verbose_name(PollingReport, 'registration_center'), 'registration_center'), (get_verbose_name(PollingReport, 'period_number'), 'period_number'), ) filterset = PollingReportFilterSet
class CenterClosedForElectionRead(LabelValueReadView): fields = ( (get_verbose_name(CenterClosedForElection, 'election'), 'election_as_html'), (get_verbose_name(CenterClosedForElection, 'registration_center'), 'registration_center_as_html'), (get_verbose_name(CenterClosedForElection, 'creation_date'), 'formatted_creation_date'), (get_verbose_name(CenterClosedForElection, 'modification_date'), 'formatted_modification_date'), )
class PreliminaryVoteCountBrowse(PaginatedBrowseView): columns = ( (get_verbose_name(PreliminaryVoteCount, 'election'), 'election'), (get_verbose_name(PreliminaryVoteCount, 'phone_number'), 'formatted_phone_number_tag'), (get_verbose_name(PreliminaryVoteCount, 'registration_center'), 'registration_center'), (get_verbose_name(PreliminaryVoteCount, 'creation_date'), 'formatted_creation_date', 'creation_date'), ) filterset = PreliminaryVoteCountFilterSet
class FieldStaffBrowse(PaginatedBrowseView): filterset = FieldStaffFilterSet columns = ( (get_verbose_name(FieldStaff, 'staff_id'), 'staff_id'), (get_verbose_name(FieldStaff, 'name'), 'name'), (get_verbose_name(FieldStaff, 'phone_number'), 'formatted_phone_number_tag'), (get_verbose_name(FieldStaff, 'suspended'), 'suspended'), ) search_fields = ['staff_id', 'name', 'phone_number'] search_terms = _('Staff Id, Name, or Phone Number')
class CenterOpenRead(LabelValueReadView): fields = ( (get_verbose_name(CenterOpen, 'election'), 'election_as_html'), (get_verbose_name(CenterOpen, 'registration_center'), 'registration_center_as_html'), (get_verbose_name(CenterOpen, 'phone_number'), 'formatted_phone_number_tag'), (get_verbose_name(CenterOpen, 'creation_date'), 'formatted_creation_date'), (get_verbose_name(CenterOpen, 'modification_date'), 'formatted_modification_date'), )
class DiscrepanciesRead(LabelValueReadView): fields = [ (_("Direction"), get_direction), (_("Message in registration system"), 'sms_as_html'), (_("Message to/from the mobile network operator"), 'vumilog_as_html'), (None, 'comments'), (None, 'resolved'), (get_verbose_name(Discrepancy, 'creation_date'), 'formatted_creation_date'), (get_verbose_name(Discrepancy, 'modification_date'), 'formatted_modification_date'), ]
class FieldStaffRead(LabelValueReadView): fields = ( (None, 'staff_id'), (None, 'name'), (get_verbose_name(FieldStaff, 'phone_number'), 'formatted_phone_number_tag'), (get_verbose_name(FieldStaff, 'suspended'), lambda context: format_tristate(context['object'].suspended)), (get_verbose_name(FieldStaff, 'creation_date'), 'formatted_creation_date'), (get_verbose_name(FieldStaff, 'modification_date'), 'formatted_modification_date'), )
class UserRead(LabelValueReadView): fields = ( (None, 'username'), (None, 'email'), (None, 'first_name'), (None, 'last_name'), (get_verbose_name(User, 'groups'), groups_formatted), (get_verbose_name(User, 'is_staff'), lambda context: format_tristate(context['object'].is_staff)), (get_verbose_name(User, 'is_active'), lambda context: format_tristate(context['object'].is_active)), (get_verbose_name(User, 'date_joined'), date_joined_formatted), )
class PollingReportRead(LabelValueReadView): fields = ( (get_verbose_name(PollingReport, 'election'), 'election_as_html'), (get_verbose_name(PollingReport, 'phone_number'), 'formatted_phone_number_tag'), (get_verbose_name(PollingReport, 'registration_center'), 'registration_center_as_html'), (None, 'period_number'), (None, 'num_voters'), (get_verbose_name(PollingReport, 'creation_date'), 'formatted_creation_date'), (get_verbose_name(PollingReport, 'modification_date'), 'formatted_modification_date'), )
class DiscrepanciesBrowse(PaginatedBrowseView): columns = [ (get_verbose_name(Discrepancy, 'creation_date'), 'formatted_creation_date', 'creation_date'), (_("Direction"), 'get_direction_display'), (_("From"), 'get_from'), (_("To"), 'get_to'), (get_verbose_name(Discrepancy, 'resolved'), 'resolved'), ] filterset = DiscrepancyFilterSet search_fields = [ 'trail__sms__from_number', 'trail__sms__to_number', 'trail__sms__message', 'trail__vumi__from_addr', 'trail__vumi__to_addr', 'trail__vumi__content', ] search_terms = _("source number, destination number, or message") def get(self, request, *args, **kwargs): # Default to "resolved=False" if 'resolved' not in request.GET: request.GET = request.GET.copy() # make editable request.GET['resolved'] = '3' # choices are 1=any, 2=True, 3=False response = super(DiscrepanciesBrowse, self).get(request, *args, **kwargs) audited = SMSTrail.objects.count() audited_messages = ungettext('%(count)d message was audited.', '%(count)d messages were audited.', audited) % { 'count': audited } messages.info(request, audited_messages) discrepancies = Discrepancy.objects.filter(resolved=False).count() if discrepancies: discrepancies_found = ungettext( 'There was %(count)d discrepancy found.', 'There were %(count)d discrepancies found.', discrepancies) % { 'count': discrepancies } messages.error(request, discrepancies_found) return response def get_queryset(self): qset = super(DiscrepanciesBrowse, self).get_queryset() return qset.select_related('trail', 'trail__sms', 'trail__vumi')
class PreliminaryVoteCountRead(LabelValueReadView): fields = ( (get_verbose_name(PreliminaryVoteCount, 'election'), 'election_as_html'), (get_verbose_name(PreliminaryVoteCount, 'phone_number'), 'formatted_phone_number_tag'), (None, 'option'), (None, 'num_votes'), (get_verbose_name(PreliminaryVoteCount, 'registration_center'), 'registration_center_as_html'), (get_verbose_name(PreliminaryVoteCount, 'creation_date'), 'formatted_creation_date'), (get_verbose_name(PreliminaryVoteCount, 'modification_date'), 'formatted_modification_date'), )
class CitizenRead(LabelValueReadView): fields = ((None, 'civil_registry_id'), (None, 'national_id'), (None, 'fbr_number'), (None, 'first_name'), (None, 'father_name'), (None, 'grandfather_name'), (None, 'family_name'), (None, 'mother_name'), (get_verbose_name(Citizen, 'birth_date'), 'formatted_birth_date'), (get_verbose_name(Citizen, 'gender'), 'gender_formatted'), (None, 'address'), (None, 'office_id'), (None, 'branch_id'), (None, 'state'), (_("Blocked"), 'blocked'), )
class StationRead(BreadLabelValueReadView): fields = ( (get_verbose_name(Station, 'election'), 'election_as_html'), (get_verbose_name(Station, 'center'), 'registration_center_as_html'), (None, 'number'), (get_verbose_name(Station, 'gender'), lambda context: GENDER_MAP[context['object'].gender]), (None, 'n_registrants'), (None, 'first_voter_name'), (None, 'first_voter_number'), (None, 'last_voter_name'), (None, 'last_voter_number'), (get_verbose_name(Station, 'creation_date'), 'formatted_creation_date'), (get_verbose_name(Station, 'modification_date'), 'formatted_modification_date'), )
class VumiLogRead(LabelValueReadView): fields = [ (get_verbose_name(VumiLog, 'from_addr'), 'from_number_formatted_tag'), (get_verbose_name(VumiLog, 'direction'), 'get_direction_display'), (get_verbose_name(VumiLog, 'to_addr'), 'to_number_formatted_tag'), (None, 'content'), (get_verbose_name(VumiLog, 'creation_date'), 'formatted_creation_date'), (get_verbose_name(VumiLog, 'modification_date'), 'formatted_modification_date'), ] def get_context_data(self, **kwargs): """Add a back_url so we can link back to the associated discrepancy""" context = super(VumiLogRead, self).get_context_data(**kwargs) context['back_url'] = self.get_object( ).smstrail.discrepancy.get_absolute_url() return context
class BroadcastApproveRejectView(LoginPermissionRequiredMixin, BreadLabelValueReadView): """View for displaying the form that allows one to approve or reject a broadcast""" exclude = [] permission_required = 'bulk_sms.read_broadcast' fields = ( (_('Sent To'), "sent_to"), (get_verbose_name(Broadcast, 'center'), "registration_center_as_html"), (None, "message"), (get_verbose_name(Broadcast, 'created_by'), "created_by_as_html"), (get_verbose_name(Broadcast, 'reviewed_by'), "reviewed_by_as_html"), (None, "batch"), (_('Status'), "status"), (_('Remaining Time'), "remaining_time"), (_('Total Messages'), "total_messages"), (_('Sent'), "sent"), (_('Errors'), "errors"), (_('Random Messages'), "random_messages"), (get_verbose_name(Broadcast, 'creation_date'), 'formatted_creation_date'), (get_verbose_name(Broadcast, 'modification_date'), 'formatted_modification_date'), ) def get(self, request, pk): """Override base class to add to context and use custom template""" # I have to override here (rather than get_template_names()/get_context_data()) in order # to get access to the request object. broadcast = get_object_or_404(Broadcast, pk=pk) batch = broadcast.batch # I must set self.object in order to use my base class' implementation of get_context_data() self.object = broadcast context = self.get_context_data() context['approve_reject_url'] = reverse( 'approve_reject_broadcast', kwargs={'broadcast_id': broadcast.id}) context['show_approve'] = request.user.has_perm('bulk_sms.approve_broadcast') and \ (batch.status in (batch.PENDING, batch.REJECTED)) context['show_reject'] = request.user.has_perm('bulk_sms.approve_broadcast') and \ (batch.status not in (batch.REJECTED, )) return render(request, 'bulk_sms/broadcast_approve_reject.html', context)
class SMSReadView(BreadLabelValueReadView): """View for reading SMSes.""" fields = ((get_verbose_name(SMS, 'from_number'), 'from_number_formatted_tag'), (get_verbose_name(SMS, 'to_number'), 'to_number_formatted_tag'), (get_verbose_name(SMS, 'citizen'), 'citizen_as_html'), (None, 'carrier'), (get_verbose_name(SMS, 'direction'), 'direction_formatted'), (get_verbose_name(SMS, 'msg_type'), 'msg_type_formatted'), (None, 'message'), (get_verbose_name(SMS, 'message_code'), 'get_message_code_display'), (None, 'uuid'), (None, 'is_audited'), (get_verbose_name(SMS, 'in_response_to'), 'in_response_to_as_html'), (None, 'need_to_anonymize'), (get_verbose_name(SMS, 'creation_date'), 'formatted_creation_date'), (get_verbose_name(SMS, 'modification_date'), 'formatted_modification_date'), )
class RegistrationRead(BreadLabelValueReadView): queryset = get_registration_bread_queryset() fields = ( (get_verbose_name(Registration, 'citizen'), 'citizen_as_html'), (get_verbose_name(Registration, 'registration_center'), 'registration_center_as_html'), (None, 'change_count'), (None, 'max_changes'), (None, 'repeat_count'), (_('Lock Status'), 'formatted_unlocked_until'), (get_verbose_name(Registration, 'sms'), 'sms_as_html'), (get_verbose_name(Registration, 'creation_date'), 'formatted_creation_date'), (get_verbose_name(Registration, 'modification_date'), 'formatted_modification_date'), (get_verbose_name(Registration, 'archive_time'), 'formatted_archive_time'), )
class RegistrationCenterReadView(RegistrationCenterConditionalDeleteMixin, BreadLabelValueReadView): """View for reg center read, implements special delete logic via mixin""" fields = [ (None, 'center_id'), (None, 'name'), (get_verbose_name(RegistrationCenter, 'office'), 'office_as_html'), (get_verbose_name(RegistrationCenter, 'constituency'), 'constituency_as_html'), (get_verbose_name(RegistrationCenter, 'subconstituency'), 'subconstituency_as_html'), (None, 'mahalla_name'), (None, 'village_name'), (get_verbose_name(RegistrationCenter, 'center_type'), 'center_type_label'), (None, 'center_lat'), (None, 'center_lon'), (None, 'copy_of'), (_("Copied by"), get_copied_by_formatted), (get_verbose_name(RegistrationCenter, 'reg_open'), lambda context: format_tristate(context['object'].reg_open)), (get_verbose_name(RegistrationCenter, 'creation_date'), 'formatted_creation_date'), (get_verbose_name(RegistrationCenter, 'modification_date'), 'formatted_modification_date'), ]
def __init__(self, *args, **kwargs): super(StaffPhoneFilterset, self).__init__(*args, **kwargs) self.filters["registration_center__office"].label = get_verbose_name(RegistrationCenter, "office") self.filters["registration_center__subconstituency"].label = get_verbose_name( RegistrationCenter, "subconstituency" )