Skip to content

Commit d018d96

Browse files
committed
Rework msg exports to MsgFolder instead of SystemLabel
1 parent e0c09a7 commit d018d96

File tree

4 files changed

+44
-63
lines changed

4 files changed

+44
-63
lines changed

temba/contacts/models.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -644,10 +644,9 @@ def get_status_counts(cls, org) -> dict:
644644
return {g.group_type: count for g, count in ContactGroup.get_member_counts(groups).items()}
645645

646646
def get_scheduled_broadcasts(self):
647-
from temba.msgs.models import SystemLabel
648-
649647
return (
650-
SystemLabel.get_queryset(self.org, SystemLabel.TYPE_SCHEDULED)
648+
self.org.broadcasts.filter(is_active=True)
649+
.exclude(schedule=None)
651650
.filter(schedule__next_fire__gte=timezone.now())
652651
.filter(Q(contacts__in=[self]) | Q(groups__in=self.groups.all()))
653652
.select_related("org", "schedule")

temba/msgs/models.py

+11-29
Original file line numberDiff line numberDiff line change
@@ -940,26 +940,6 @@ def get_counts(cls, org):
940940
counts = org.counts.prefix("msgs:folder:").scope_totals()
941941
return {lb: counts.get(f"msgs:folder:{lb}", 0) for lb, n in cls.TYPE_CHOICES}
942942

943-
@classmethod
944-
def get_queryset(cls, org, label_type):
945-
"""
946-
Gets the queryset for the given system label. Any change here needs to be reflected in a change to the db
947-
trigger used to maintain the label counts.
948-
"""
949-
950-
assert label_type in [c[0] for c in cls.TYPE_CHOICES]
951-
952-
if label_type == cls.TYPE_SCHEDULED:
953-
return org.broadcasts.filter(is_active=True).exclude(schedule=None)
954-
elif label_type == cls.TYPE_CALLS:
955-
return org.calls.all()
956-
957-
return MsgFolder.from_code(label_type).get_queryset(org)
958-
959-
@classmethod
960-
def get_archive_query(cls, label_type: str) -> dict:
961-
return MsgFolder.from_code(label_type).get_archive_query()
962-
963943

964944
class Label(TembaModel, DependencyMixin):
965945
"""
@@ -1151,14 +1131,16 @@ def create(cls, org, user, start_date, end_date, system_label=None, label=None,
11511131

11521132
def get_folder(self, export):
11531133
label_uuid = export.config.get("label_uuid")
1154-
system_label = export.config.get("system_label")
1134+
folder_code = export.config.get("system_label")
11551135
if label_uuid:
11561136
return None, export.org.msgs_labels.filter(uuid=label_uuid).first()
1137+
elif folder_code:
1138+
return MsgFolder.from_code(folder_code), None
11571139
else:
1158-
return system_label, None
1140+
return None, None
11591141

11601142
def write(self, export):
1161-
system_label, label = self.get_folder(export)
1143+
folder, label = self.get_folder(export)
11621144
start_date, end_date = export.get_date_range()
11631145

11641146
# create our exporter
@@ -1172,7 +1154,7 @@ def write(self, export):
11721154
num_records = 0
11731155
logger.info(f"starting msgs export #{export.id} for org #{export.org.id}")
11741156

1175-
for batch in self._get_msg_batches(export, system_label, label, start_date, end_date):
1157+
for batch in self._get_msg_batches(export, folder, label, start_date, end_date):
11761158
self._write_msgs(export, exporter, batch)
11771159

11781160
num_records += len(batch)
@@ -1183,13 +1165,13 @@ def write(self, export):
11831165

11841166
return *exporter.save_file(), num_records
11851167

1186-
def _get_msg_batches(self, export, system_label, label, start_date, end_date):
1168+
def _get_msg_batches(self, export, folder, label, start_date, end_date):
11871169
from temba.archives.models import Archive
11881170
from temba.flows.models import Flow
11891171

11901172
# firstly get msgs from archives
1191-
if system_label:
1192-
where = SystemLabel.get_archive_query(system_label)
1173+
if folder:
1174+
where = folder.get_archive_query()
11931175
elif label:
11941176
where = {"visibility": "visible", "__raw__": f"'{label.uuid}' IN s.labels[*].uuid"}
11951177
else:
@@ -1208,8 +1190,8 @@ def _get_msg_batches(self, export, system_label, label, start_date, end_date):
12081190
matching.append(record)
12091191
yield matching
12101192

1211-
if system_label:
1212-
messages = SystemLabel.get_queryset(export.org, system_label)
1193+
if folder:
1194+
messages = folder.get_queryset(export.org)
12131195
elif label:
12141196
messages = label.get_messages()
12151197
else:

temba/msgs/tests/test_systemlabel.py temba/msgs/tests/test_msg_folder.py

+11-11
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,45 @@
11
from django.utils import timezone
22

33
from temba.flows.models import Flow, FlowRun, FlowSession
4-
from temba.msgs.models import Msg, SystemLabel
4+
from temba.msgs.models import Msg, MsgFolder, SystemLabel
55
from temba.orgs.tasks import squash_item_counts
66
from temba.schedules.models import Schedule
77
from temba.tests import TembaTest
88
from temba.utils import s3
99

1010

11-
class SystemLabelTest(TembaTest):
11+
class MsgFolderTest(TembaTest):
1212
def test_get_archive_query(self):
1313
tcs = (
1414
(
15-
SystemLabel.TYPE_INBOX,
15+
MsgFolder.INBOX,
1616
"SELECT s.* FROM s3object s WHERE s.direction = 'in' AND s.visibility = 'visible' AND s.status = 'handled' AND s.flow IS NULL AND s.type != 'voice'",
1717
),
1818
(
19-
SystemLabel.TYPE_FLOWS,
19+
MsgFolder.HANDLED,
2020
"SELECT s.* FROM s3object s WHERE s.direction = 'in' AND s.visibility = 'visible' AND s.status = 'handled' AND s.flow IS NOT NULL AND s.type != 'voice'",
2121
),
2222
(
23-
SystemLabel.TYPE_ARCHIVED,
23+
MsgFolder.ARCHIVED,
2424
"SELECT s.* FROM s3object s WHERE s.direction = 'in' AND s.visibility = 'archived' AND s.status = 'handled' AND s.type != 'voice'",
2525
),
2626
(
27-
SystemLabel.TYPE_OUTBOX,
27+
MsgFolder.OUTBOX,
2828
"SELECT s.* FROM s3object s WHERE s.direction = 'out' AND s.visibility = 'visible' AND s.status IN ('initializing', 'queued', 'errored')",
2929
),
3030
(
31-
SystemLabel.TYPE_SENT,
31+
MsgFolder.SENT,
3232
"SELECT s.* FROM s3object s WHERE s.direction = 'out' AND s.visibility = 'visible' AND s.status IN ('wired', 'sent', 'delivered', 'read')",
3333
),
3434
(
35-
SystemLabel.TYPE_FAILED,
35+
MsgFolder.FAILED,
3636
"SELECT s.* FROM s3object s WHERE s.direction = 'out' AND s.visibility = 'visible' AND s.status = 'failed'",
3737
),
3838
)
3939

40-
for label_type, expected_select in tcs:
41-
select = s3.compile_select(where=SystemLabel.get_archive_query(label_type))
42-
self.assertEqual(expected_select, select, f"select s3 mismatch for label {label_type}")
40+
for folder, expected_select in tcs:
41+
select = s3.compile_select(where=folder.get_archive_query())
42+
self.assertEqual(expected_select, select, f"select s3 mismatch for {folder}")
4343

4444
def test_get_counts(self):
4545
def assert_counts(org, expected: dict):

temba/msgs/views.py

+20-20
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
from temba.utils.views.wizard import SmartWizardUpdateView, SmartWizardView
4545

4646
from .forms import ComposeForm, ScheduleForm, TargetForm
47-
from .models import Broadcast, Label, LabelCount, Media, MessageExport, Msg, OptIn, SystemLabel
47+
from .models import Broadcast, Label, LabelCount, Media, MessageExport, Msg, MsgFolder, OptIn, SystemLabel
4848

4949

5050
class MsgListView(ContextMenuMixin, BulkActionMixin, SpaMixin, BaseListView):
@@ -58,20 +58,20 @@ class MsgListView(ContextMenuMixin, BulkActionMixin, SpaMixin, BaseListView):
5858
allow_export = False
5959
bulk_actions = ()
6060
bulk_action_permissions = {"resend": "msgs.msg_create", "delete": "msgs.msg_update"}
61-
system_label = None
61+
folder = None
6262
paginate_by = 100
6363

6464
def pre_process(self, request, *args, **kwargs):
65-
if self.system_label:
66-
self.queryset = SystemLabel.get_queryset(request.org, self.system_label)
65+
if self.folder:
66+
self.queryset = self.folder.get_queryset(request.org)
6767

68-
def derive_label(self):
69-
return self.system_label
68+
def derive_folder(self):
69+
return self.folder
7070

7171
def derive_export_url(self):
7272
redirect = quote_plus(self.request.get_full_path())
73-
label = self.derive_label()
74-
label_id = label.uuid if isinstance(label, Label) else label
73+
folder = self.derive_folder()
74+
label_id = folder.uuid if isinstance(folder, Label) else folder.code
7575
return "%s?l=%s&redirect=%s" % (reverse("msgs.msg_export"), label_id, redirect)
7676

7777
def get_queryset(self, **kwargs):
@@ -91,14 +91,14 @@ def get_queryset(self, **kwargs):
9191
def get_context_data(self, **kwargs):
9292
org = self.request.org
9393
counts = SystemLabel.get_counts(org)
94-
label = self.derive_label()
94+
folder = self.derive_folder()
9595

9696
# if there isn't a search filtering the queryset, we can replace the count function with a pre-calculated value
9797
if "search" not in self.request.GET:
98-
if isinstance(label, Label):
99-
patch_queryset_count(self.object_list, label.get_visible_count)
100-
elif isinstance(label, str):
101-
patch_queryset_count(self.object_list, lambda: counts[label])
98+
if isinstance(folder, Label):
99+
patch_queryset_count(self.object_list, folder.get_visible_count)
100+
elif isinstance(folder, MsgFolder):
101+
patch_queryset_count(self.object_list, lambda: counts[folder.code])
102102

103103
context = super().get_context_data(**kwargs)
104104
context["has_messages"] = (
@@ -699,7 +699,7 @@ def derive_url_pattern(cls, path, action):
699699
class Inbox(MsgListView):
700700
title = _("Inbox")
701701
template_name = "msgs/message_box.html"
702-
system_label = SystemLabel.TYPE_INBOX
702+
folder = MsgFolder.INBOX
703703
bulk_actions = ("archive", "label")
704704
allow_export = True
705705
menu_path = "/msg/inbox"
@@ -715,7 +715,7 @@ def get_queryset(self, **kwargs):
715715
class Flow(MsgListView):
716716
title = _("Handled")
717717
template_name = "msgs/message_box.html"
718-
system_label = SystemLabel.TYPE_FLOWS
718+
folder = MsgFolder.HANDLED
719719
bulk_actions = ("archive", "label")
720720
allow_export = True
721721
menu_path = "/msg/handled"
@@ -727,7 +727,7 @@ def get_queryset(self, **kwargs):
727727
class Archived(MsgListView):
728728
title = _("Archived")
729729
template_name = "msgs/message_box.html"
730-
system_label = SystemLabel.TYPE_ARCHIVED
730+
folder = MsgFolder.ARCHIVED
731731
bulk_actions = ("restore", "label", "delete")
732732
allow_export = True
733733

@@ -738,7 +738,7 @@ def get_queryset(self, **kwargs):
738738
class Outbox(MsgListView):
739739
title = _("Outbox")
740740
template_name = "msgs/message_box.html"
741-
system_label = SystemLabel.TYPE_OUTBOX
741+
folder = MsgFolder.OUTBOX
742742
bulk_actions = ()
743743
allow_export = True
744744

@@ -748,7 +748,7 @@ def get_queryset(self, **kwargs):
748748
class Sent(MsgListView):
749749
title = _("Sent")
750750
template_name = "msgs/msg_sent.html"
751-
system_label = SystemLabel.TYPE_SENT
751+
folder = MsgFolder.SENT
752752
bulk_actions = ()
753753
allow_export = True
754754
default_order = ("-sent_on", "-id")
@@ -759,7 +759,7 @@ def get_queryset(self, **kwargs):
759759
class Failed(MsgListView):
760760
title = _("Failed")
761761
template_name = "msgs/message_box.html"
762-
system_label = SystemLabel.TYPE_FAILED
762+
folder = MsgFolder.FAILED
763763
allow_export = True
764764

765765
def get_bulk_actions(self):
@@ -810,7 +810,7 @@ def derive_url_pattern(cls, path, action):
810810
def label(self):
811811
return self.request.org.msgs_labels.get(uuid=self.kwargs["label_uuid"])
812812

813-
def derive_label(self):
813+
def derive_folder(self):
814814
return self.label
815815

816816
def get_queryset(self, **kwargs):

0 commit comments

Comments
 (0)