def get_data(self, request): since = timezone.now() - relativedelta(days=self.num_days) labels = Label.get_all(request.org, request.user) counts_by_label = DailyCount.get_by_label(labels, DailyCount.TYPE_INCOMING, since).scope_totals() # sort by highest count DESC, label name ASC by_usage = sorted(counts_by_label.items(), key=lambda c: (-c[1], c[0].name)) by_usage = [c for c in by_usage if c[1]] # remove zero counts if len(by_usage) > self.num_items: label_zones = by_usage[:self.num_items - 1] others = by_usage[self.num_items - 1:] else: label_zones = by_usage others = [] series = [{"name": l[0].name, "y": l[1]} for l in label_zones] # if there are remaining items, merge into single "Other" zone if others: series.append({ "name": str(_("Other")), "y": sum([o[1] for o in others]) }) return {"series": series}
def post(self, request, *args, **kwargs): case = self.get_object() label_ids = parse_csv(request.POST.get('labels', ''), as_ints=True) labels = Label.get_all(request.org).filter(pk__in=label_ids) case.update_labels(request.user, labels) return HttpResponse(status=204)
def get_context_data(self, **kwargs): context = super(BaseInboxView, self).get_context_data(**kwargs) org = self.request.org user = self.request.user partner = user.get_partner(org) labels = list(Label.get_all(org, user).order_by("name")) Label.bulk_cache_initialize(labels) fields = Field.get_all(org, visible=True).order_by("label") # angular app requires context data in JSON format context["context_data_json"] = json_encode({ "user": { "id": user.pk, "partner": partner.as_json() if partner else None }, "labels": [l.as_json() for l in labels], "fields": [f.as_json() for f in fields], }) context["banner_text"] = org.get_banner_text() context["folder"] = self.folder.name context["folder_icon"] = self.folder_icon context["open_case_count"] = Case.get_open(org, user).count() context["closed_case_count"] = Case.get_closed(org, user).count() context["allow_case_without_message"] = getattr( settings, "SITE_ALLOW_CASE_WITHOUT_MESSAGE", False) context[ "user_must_reply_with_faq"] = org and not user.is_anonymous and user.must_use_faq( ) context["site_contact_display"] = getattr(settings, "SITE_CONTACT_DISPLAY", "name") return context
def get_day_totals(self, request, since): label_id = request.GET.get('label') if label_id: label = Label.get_all(org=request.org).get(pk=label_id) return DailyCount.get_by_label([label], DailyCount.TYPE_INCOMING, since).day_totals() else: return DailyCount.get_by_org([self.request.org], DailyCount.TYPE_INCOMING, since).day_totals()
def post(self, request, *args, **kwargs): case = self.get_object() user = request.user user_labels = Label.get_all(self.org, user) label_ids = request.json['labels'] specified_labels = list(user_labels.filter(pk__in=label_ids)) # user can't remove labels that they can't see unseen_labels = [l for l in case.labels.all() if l not in user_labels] case.update_labels(user, specified_labels + unseen_labels) return HttpResponse(status=204)
def get_context_data(self, **kwargs): context = super(CaseCRUDL.Read, self).get_context_data(**kwargs) case = self.get_object() labels = Label.get_all(self.request.org).order_by('name') can_update = case.access_level(self.request.user) == AccessLevel.update # angular app requires context data in JSON format context['context_data_json'] = json_encode({ 'all_labels': [l.as_json() for l in labels] }) context['max_msg_chars'] = MAX_MESSAGE_CHARS context['can_update'] = can_update context['alert'] = self.request.GET.get('alert', None) return context
def get_context_data(self, **kwargs): context = super(CaseCRUDL.Read, self).get_context_data(**kwargs) case = self.get_object() can_update = case.access_level( self.request.user) == AccessLevel.update labels = Label.get_all(self.request.org).order_by("name") fields = Field.get_all(self.object.org, visible=True).order_by("label") # angular app requires context data in JSON format context["context_data_json"] = { "all_labels": [l.as_json() for l in labels], "fields": [f.as_json() for f in fields], } context["can_update"] = can_update context["alert"] = self.request.GET.get("alert", None) context["case_id"] = case.id return context
class Label(OrgObjPermsMixin, SmartUpdateView): """ JSON endpoint for labelling a case """ permission = 'cases.case_update' def post(self, request, *args, **kwargs): case = self.get_object() user = request.user user_labels = Label.get_all(self.org, user) label_ids = request.json['labels'] specified_labels = list(user_labels.filter(pk__in=label_ids)) # user can't remove labels that they can't see unseen_labels = [ l for l in case.labels.all() if l not in user_labels ] case.update_labels(user, specified_labels + unseen_labels) return HttpResponse(status=204)
def render_book(self, book): if self.type == self.TYPE_LABEL: sheet = book.add_sheet(six.text_type(_("Incoming Messages"))) labels = list(Label.get_all(self.org).order_by('name')) # get each label's day counts and organise by label and day totals_by_label = {} for label in labels: totals = DailyCount.get_by_label([label], DailyCount.TYPE_INCOMING, self.since, self.until).day_totals() totals_by_label[label] = {t[0]: t[1] for t in totals} self.write_row(sheet, 0, ["Date"] + [l.name for l in labels]) row = 1 for day in date_range(self.since, self.until): totals = [totals_by_label.get(l, {}).get(day, 0) for l in labels] self.write_row(sheet, row, [day] + totals) row += 1 elif self.type == self.TYPE_PARTNER: sheet = book.add_sheet(six.text_type(_("Replies Sent"))) partners = list(Partner.get_all(self.org).order_by('name')) # get each partner's day counts and organise by partner and day totals_by_partner = {} for partner in partners: totals = DailyCount.get_by_partner([partner], DailyCount.TYPE_REPLIES, self.since, self.until).day_totals() totals_by_partner[partner] = {t[0]: t[1] for t in totals} self.write_row(sheet, 0, ["Date"] + [p.name for p in partners]) row = 1 for day in date_range(self.since, self.until): totals = [totals_by_partner.get(l, {}).get(day, 0) for l in partners] self.write_row(sheet, row, [day] + totals) row += 1
def get_context_data(self, **kwargs): context = super(BaseHomeView, self).get_context_data(**kwargs) org = self.request.org user = self.request.user partner = user.get_partner(org) labels = Label.get_all(org, user).order_by('name') groups = Group.get_all(org, visible=True).order_by('name') # angular app requires context data in JSON format context['context_data_json'] = json_encode({ 'user': {'id': user.pk, 'partner': partner.as_json() if partner else None}, 'labels': [l.as_json() for l in labels], 'groups': [g.as_json() for g in groups], }) context['banner_text'] = org.get_banner_text() context['folder'] = self.folder.name context['folder_icon'] = self.folder_icon context['open_case_count'] = Case.get_open(org, user).count() context['closed_case_count'] = Case.get_closed(org, user).count() return context
def get_context_data(self, **kwargs): context = super(CaseCRUDL.Read, self).get_context_data(**kwargs) case = self.get_object() can_update = case.access_level( self.request.user) == AccessLevel.update labels = Label.get_all(self.request.org).order_by('name') fields = Field.get_all(self.object.org, visible=True).order_by('label') # angular app requires context data in JSON format context['context_data_json'] = json_encode({ 'all_labels': [l.as_json() for l in labels], 'fields': [f.as_json() for f in fields], }) context['can_update'] = can_update context['alert'] = self.request.GET.get('alert', None) context['case_id'] = case.id context['pods'] = pod_registry.pods context['pod_types'] = pod_registry.pod_types return context
def get_context_data(self, **kwargs): context = super(BaseInboxView, self).get_context_data(**kwargs) org = self.request.org user = self.request.user partner = user.get_partner(org) labels = list(Label.get_all(org, user).order_by('name')) Label.bulk_cache_initialize(labels) groups = Group.get_all(org, visible=True).order_by('name') fields = Field.get_all(org, visible=True).order_by('label') # angular app requires context data in JSON format context['context_data_json'] = json_encode({ 'user': { 'id': user.pk, 'partner': partner.as_json() if partner else None }, 'labels': [l.as_json() for l in labels], 'groups': [g.as_json() for g in groups], 'fields': [f.as_json() for f in fields], }) context['banner_text'] = org.get_banner_text() context['folder'] = self.folder.name context['folder_icon'] = self.folder_icon context['open_case_count'] = Case.get_open(org, user).count() context['closed_case_count'] = Case.get_closed(org, user).count() context['allow_case_without_message'] = getattr( settings, 'SITE_ALLOW_CASE_WITHOUT_MESSAGE', False) context['user_must_reply_with_faq'] = org and not user.is_anonymous( ) and user.must_use_faq() context['site_contact_display'] = getattr(settings, 'SITE_CONTACT_DISPLAY', "name") return context
def render_book(self, book): if self.type == self.TYPE_LABEL: sheet = book.add_sheet(six.text_type(_("Incoming Messages"))) labels = list(Label.get_all(self.org).order_by('name')) # get each label's day counts and organise by label and day totals_by_label = {} for label in labels: totals = DailyCount.get_by_label([label], DailyCount.TYPE_INCOMING, self.since, self.until).day_totals() totals_by_label[label] = {t[0]: t[1] for t in totals} self.write_row(sheet, 0, ["Date"] + [l.name for l in labels]) row = 1 for day in date_range(self.since, self.until): totals = [totals_by_label.get(l, {}).get(day, 0) for l in labels] self.write_row(sheet, row, [day] + totals) row += 1 elif self.type == self.TYPE_USER: replies_sheet = book.add_sheet(six.text_type(_("Replies Sent"))) cases_opened_sheet = book.add_sheet(six.text_type(_("Cases Opened"))) cases_closed_sheet = book.add_sheet(six.text_type(_("Cases Closed"))) users = self.org.get_org_users().order_by('profile__full_name') replies_totals_by_user = {} cases_opened_by_user = {} cases_closed_by_user = {} for user in users: replies_totals = DailyCount.get_by_user( self.org, [user], DailyCount.TYPE_REPLIES, self.since, self.until).day_totals() cases_opened_totals = DailyCount.get_by_user( self.org, [user], DailyCount.TYPE_CASE_OPENED, self.since, self.until).day_totals() cases_closed_totals = DailyCount.get_by_user( self.org, [user], DailyCount.TYPE_CASE_CLOSED, self.since, self.until).day_totals() replies_totals_by_user[user] = {t[0]: t[1] for t in replies_totals} cases_opened_by_user[user] = {t[0]: t[1] for t in cases_opened_totals} cases_closed_by_user[user] = {t[0]: t[1] for t in cases_closed_totals} self.write_row(replies_sheet, 0, ["Date"] + [u.get_full_name() for u in users]) self.write_row(cases_opened_sheet, 0, ["Date"] + [u.get_full_name() for u in users]) self.write_row(cases_closed_sheet, 0, ["Date"] + [u.get_full_name() for u in users]) row = 1 for day in date_range(self.since, self.until): replies_totals = [replies_totals_by_user.get(u, {}).get(day, 0) for u in users] cases_opened_totals = [cases_opened_by_user.get(u, {}).get(day, 0) for u in users] cases_closed_totals = [cases_closed_by_user.get(u, {}).get(day, 0) for u in users] self.write_row(replies_sheet, row, [day] + replies_totals) self.write_row(cases_opened_sheet, row, [day] + cases_opened_totals) self.write_row(cases_closed_sheet, row, [day] + cases_closed_totals) row += 1 elif self.type == self.TYPE_PARTNER: replies_sheet = book.add_sheet(six.text_type(_("Replies Sent"))) ave_sheet = book.add_sheet(six.text_type(_("Average Reply Time"))) ave_closed_sheet = book.add_sheet(six.text_type(_("Average Closed Time"))) cases_opened_sheet = book.add_sheet(six.text_type(_("Cases Opened"))) cases_closed_sheet = book.add_sheet(six.text_type(_("Cases Closed"))) partners = list(Partner.get_all(self.org).order_by('name')) # get each partner's day counts and organise by partner and day replies_totals_by_partner = {} cases_opened_by_partner = {} cases_closed_by_partner = {} replied_averages_by_partner = {} closed_averages_by_partner = {} for partner in partners: replies_totals = DailyCount.get_by_partner([partner], DailyCount.TYPE_REPLIES, self.since, self.until).day_totals() cases_opened_totals = DailyCount.get_by_partner([partner], DailyCount.TYPE_CASE_OPENED, self.since, self.until).day_totals() cases_closed_totals = DailyCount.get_by_partner([partner], DailyCount.TYPE_CASE_CLOSED, self.since, self.until).day_totals() replies_totals_by_partner[partner] = {t[0]: t[1] for t in replies_totals} cases_opened_by_partner[partner] = {t[0]: t[1] for t in cases_opened_totals} cases_closed_by_partner[partner] = {t[0]: t[1] for t in cases_closed_totals} replied_second_totals = DailySecondTotalCount.get_by_partner([partner], DailySecondTotalCount.TYPE_TILL_REPLIED, self.since, self.until).day_totals() replied_averages_by_partner[partner] = {t[0]: (float(t[2]) / t[1]) for t in replied_second_totals} closed_second_totals = DailySecondTotalCount.get_by_partner([partner], DailySecondTotalCount.TYPE_TILL_CLOSED, self.since, self.until).day_totals() closed_averages_by_partner[partner] = {t[0]: (float(t[2]) / t[1]) for t in closed_second_totals} self.write_row(replies_sheet, 0, ["Date"] + [p.name for p in partners]) self.write_row(cases_opened_sheet, 0, ["Date"] + [p.name for p in partners]) self.write_row(cases_closed_sheet, 0, ["Date"] + [p.name for p in partners]) self.write_row(ave_sheet, 0, ["Date"] + [p.name for p in partners]) self.write_row(ave_closed_sheet, 0, ["Date"] + [p.name for p in partners]) row = 1 for day in date_range(self.since, self.until): replies_totals = [replies_totals_by_partner.get(l, {}).get(day, 0) for l in partners] cases_opened_totals = [cases_opened_by_partner.get(l, {}).get(day, 0) for l in partners] cases_closed_totals = [cases_closed_by_partner.get(l, {}).get(day, 0) for l in partners] replied_averages = [replied_averages_by_partner.get(l, {}).get(day, 0) for l in partners] closed_averages = [closed_averages_by_partner.get(l, {}).get(day, 0) for l in partners] self.write_row(replies_sheet, row, [day] + replies_totals) self.write_row(cases_opened_sheet, row, [day] + cases_opened_totals) self.write_row(cases_closed_sheet, row, [day] + cases_closed_totals) self.write_row(ave_sheet, row, [day] + replied_averages) self.write_row(ave_closed_sheet, row, [day] + closed_averages) row += 1
def get_labels(self): return self.labels.filter(is_active=True) if self.is_restricted else Label.get_all(self.org)
def render_book(self, book): if self.type == self.TYPE_LABEL: sheet = book.add_sheet(str(_("Incoming Messages"))) labels = list(Label.get_all(self.org).order_by("name")) # get each label's day counts and organise by label and day totals_by_label = {} for label in labels: totals = DailyCount.get_by_label([label], DailyCount.TYPE_INCOMING, self.since, self.until).day_totals() totals_by_label[label] = {t[0]: t[1] for t in totals} self.write_row(sheet, 0, ["Date"] + [l.name for l in labels]) row = 1 for day in date_range(self.since, self.until): totals = [ totals_by_label.get(l, {}).get(day, 0) for l in labels ] self.write_row(sheet, row, [day] + totals) row += 1 elif self.type == self.TYPE_USER: replies_sheet = book.add_sheet(str(_("Replies Sent"))) cases_opened_sheet = book.add_sheet(str(_("Cases Opened"))) cases_closed_sheet = book.add_sheet(str(_("Cases Closed"))) users = self.org.get_org_users().order_by("profile__full_name") replies_totals_by_user = {} cases_opened_by_user = {} cases_closed_by_user = {} for user in users: replies_totals = DailyCount.get_by_user( self.org, [user], DailyCount.TYPE_REPLIES, self.since, self.until).day_totals() cases_opened_totals = DailyCount.get_by_user( self.org, [user], DailyCount.TYPE_CASE_OPENED, self.since, self.until).day_totals() cases_closed_totals = DailyCount.get_by_user( self.org, [user], DailyCount.TYPE_CASE_CLOSED, self.since, self.until).day_totals() replies_totals_by_user[user] = { t[0]: t[1] for t in replies_totals } cases_opened_by_user[user] = { t[0]: t[1] for t in cases_opened_totals } cases_closed_by_user[user] = { t[0]: t[1] for t in cases_closed_totals } self.write_row(replies_sheet, 0, ["Date"] + [u.get_full_name() for u in users]) self.write_row(cases_opened_sheet, 0, ["Date"] + [u.get_full_name() for u in users]) self.write_row(cases_closed_sheet, 0, ["Date"] + [u.get_full_name() for u in users]) row = 1 for day in date_range(self.since, self.until): replies_totals = [ replies_totals_by_user.get(u, {}).get(day, 0) for u in users ] cases_opened_totals = [ cases_opened_by_user.get(u, {}).get(day, 0) for u in users ] cases_closed_totals = [ cases_closed_by_user.get(u, {}).get(day, 0) for u in users ] self.write_row(replies_sheet, row, [day] + replies_totals) self.write_row(cases_opened_sheet, row, [day] + cases_opened_totals) self.write_row(cases_closed_sheet, row, [day] + cases_closed_totals) row += 1 elif self.type == self.TYPE_PARTNER: replies_sheet = book.add_sheet(str(_("Replies Sent"))) ave_sheet = book.add_sheet(str(_("Average Reply Time"))) ave_closed_sheet = book.add_sheet(str(_("Average Closed Time"))) cases_opened_sheet = book.add_sheet(str(_("Cases Opened"))) cases_closed_sheet = book.add_sheet(str(_("Cases Closed"))) partners = list(Partner.get_all(self.org).order_by("name")) # get each partner's day counts and organise by partner and day replies_totals_by_partner = {} cases_opened_by_partner = {} cases_closed_by_partner = {} replied_averages_by_partner = {} closed_averages_by_partner = {} for partner in partners: replies_totals = DailyCount.get_by_partner( [partner], DailyCount.TYPE_REPLIES, self.since, self.until).day_totals() cases_opened_totals = DailyCount.get_by_partner( [partner], DailyCount.TYPE_CASE_OPENED, self.since, self.until).day_totals() cases_closed_totals = DailyCount.get_by_partner( [partner], DailyCount.TYPE_CASE_CLOSED, self.since, self.until).day_totals() replies_totals_by_partner[partner] = { t[0]: t[1] for t in replies_totals } cases_opened_by_partner[partner] = { t[0]: t[1] for t in cases_opened_totals } cases_closed_by_partner[partner] = { t[0]: t[1] for t in cases_closed_totals } replied_second_totals = DailySecondTotalCount.get_by_partner( [partner], DailySecondTotalCount.TYPE_TILL_REPLIED, self.since, self.until).day_totals() replied_averages_by_partner[partner] = { t[0]: (float(t[2]) / t[1]) for t in replied_second_totals } closed_second_totals = DailySecondTotalCount.get_by_partner( [partner], DailySecondTotalCount.TYPE_TILL_CLOSED, self.since, self.until).day_totals() closed_averages_by_partner[partner] = { t[0]: (float(t[2]) / t[1]) for t in closed_second_totals } self.write_row(replies_sheet, 0, ["Date"] + [p.name for p in partners]) self.write_row(cases_opened_sheet, 0, ["Date"] + [p.name for p in partners]) self.write_row(cases_closed_sheet, 0, ["Date"] + [p.name for p in partners]) self.write_row(ave_sheet, 0, ["Date"] + [p.name for p in partners]) self.write_row(ave_closed_sheet, 0, ["Date"] + [p.name for p in partners]) row = 1 for day in date_range(self.since, self.until): replies_totals = [ replies_totals_by_partner.get(l, {}).get(day, 0) for l in partners ] cases_opened_totals = [ cases_opened_by_partner.get(l, {}).get(day, 0) for l in partners ] cases_closed_totals = [ cases_closed_by_partner.get(l, {}).get(day, 0) for l in partners ] replied_averages = [ replied_averages_by_partner.get(l, {}).get(day, 0) for l in partners ] closed_averages = [ closed_averages_by_partner.get(l, {}).get(day, 0) for l in partners ] self.write_row(replies_sheet, row, [day] + replies_totals) self.write_row(cases_opened_sheet, row, [day] + cases_opened_totals) self.write_row(cases_closed_sheet, row, [day] + cases_closed_totals) self.write_row(ave_sheet, row, [day] + replied_averages) self.write_row(ave_closed_sheet, row, [day] + closed_averages) row += 1
def __init__(self, *args, **kwargs): org = kwargs.pop('org') super(PartnerForm, self).__init__(*args, **kwargs) self.fields['labels'].queryset = Label.get_all(org).order_by('name')
def __init__(self, *args, **kwargs): org = kwargs.pop('org') super(BasePartnerForm, self).__init__(*args, **kwargs) self.fields['labels'].queryset = Label.get_all(org).order_by('name')
def __init__(self, *args, **kwargs): org = kwargs.pop("org") super(BasePartnerForm, self).__init__(*args, **kwargs) self.fields["labels"].queryset = Label.get_all(org).order_by("name")