Skip to content

Commit

Permalink
action from on to one to foreign key
Browse files Browse the repository at this point in the history
  • Loading branch information
Svyat committed Jun 4, 2024
1 parent 7e7aa70 commit 51787a9
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 10 deletions.
2 changes: 1 addition & 1 deletion tests/test_admin_site.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@


expected_trigger_components: Mapping[str, List[Type[TriggerComponent]]] = {
'action': [
'actions': [
SendEmailAction,
],
'conditions': [
Expand Down
2 changes: 1 addition & 1 deletion tests/test_completed_important_task_notification.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ def test_notification(
):
assert str(trigger) == 'Important Task Completed'
assert str(trigger.events.first()) == 'important task completed'
assert str(trigger.action) == 'send email action'
assert str(trigger.actions.first()) == 'send email action'
assert str(trigger.conditions.first()) == 'action count no more than 1'
initial_action_count = _get_action_count(user)
task.complete()
Expand Down
12 changes: 8 additions & 4 deletions triggers/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ class TriggerAdmin(PolymorphicInlineSupportMixin, admin.ModelAdmin):
'name',
'display_events',
'display_conditions',
'display_action',
'display_actions',
'is_enabled',
)
list_filter = (
Expand All @@ -89,7 +89,7 @@ class TriggerAdmin(PolymorphicInlineSupportMixin, admin.ModelAdmin):

def get_queryset(self, request):
base_queryset = super().get_queryset(request)
return base_queryset.prefetch_related('events', 'conditions').select_related('action')
return base_queryset.prefetch_related('events', 'conditions', 'actions')

@admin.display(description=_('events'), ordering="event__polymorphic_ctype")
def display_events(self, obj: Trigger) -> str:
Expand All @@ -108,8 +108,12 @@ def display_conditions(self, obj: Trigger):
)

@admin.display(description=_('action'), ordering="action__polymorphic_ctype")
def display_action(self, obj: Trigger):
return str(obj.action.get_real_instance()).capitalize() if hasattr(obj, 'action') else None
def display_actions(self, obj: Trigger):
return format_html_join(
'\n',
'<li>{0}</li>',
sorted((str(action).capitalize(),) for action in obj.actions.all()),
)


@admin.register(Activity)
Expand Down
19 changes: 19 additions & 0 deletions triggers/migrations/0004_alter_action_trigger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 3.2.20 on 2024-06-04 05:14

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('triggers', '0003_event_delay'),
]

operations = [
migrations.AlterField(
model_name='action',
name='trigger',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='actions', related_query_name='action', to='triggers.trigger', verbose_name='trigger'),
),
]
10 changes: 6 additions & 4 deletions triggers/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ def __str__(self):

@property
def is_active(self) -> bool:
return self.is_enabled and hasattr(self, 'action')
return self.is_enabled and self.actions.exists()

def filter_user_queryset(self, user_queryset: models.QuerySet) -> models.QuerySet:
if not self.is_active:
Expand All @@ -44,7 +44,8 @@ def filter_user_queryset(self, user_queryset: models.QuerySet) -> models.QuerySe
def on_event(self, user, context: Mapping[str, Any]):
if user and all(condition.is_satisfied(user) for condition in self.conditions.all()):
with Activity.lock(user, self):
self.action.perform(user, context)
for action in self.actions.all():
action.perform(user, context)


class Activity(PolymorphicModel):
Expand Down Expand Up @@ -93,10 +94,11 @@ def lock(cls, user, trigger: Trigger) -> Generator['Activity', None, None]:


class Action(PolymorphicModel):
trigger = models.OneToOneField(
trigger = models.ForeignKey(
to=Trigger,
on_delete=models.CASCADE,
related_name='action',
related_name='actions',
related_query_name='action',
verbose_name=_('trigger'),
)

Expand Down

0 comments on commit 51787a9

Please sign in to comment.