</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">594</context>
+ <context context-type="linenumber">597</context>
</context-group>
</trans-unit>
<trans-unit id="2526035785704676448" datatype="html">
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">694</context>
+ <context context-type="linenumber">708</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">754</context>
+ <context context-type="linenumber">768</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">821</context>
+ <context context-type="linenumber">835</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">884</context>
+ <context context-type="linenumber">898</context>
</context-group>
</trans-unit>
<trans-unit id="1181910457994920507" datatype="html">
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">696</context>
+ <context context-type="linenumber">710</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">756</context>
+ <context context-type="linenumber">770</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">823</context>
+ <context context-type="linenumber">837</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">886</context>
+ <context context-type="linenumber">900</context>
</context-group>
</trans-unit>
<trans-unit id="5729001209753056399" datatype="html">
<source>Saved view "<x id="PH" equiv-text="savedView.name"/>" deleted.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">476</context>
+ <context context-type="linenumber">479</context>
</context-group>
</trans-unit>
<trans-unit id="3891152409365583719" datatype="html">
<source>Settings saved</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">578</context>
+ <context context-type="linenumber">581</context>
</context-group>
</trans-unit>
<trans-unit id="7217000812750597833" datatype="html">
<source>Settings were saved successfully.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">579</context>
+ <context context-type="linenumber">582</context>
</context-group>
</trans-unit>
<trans-unit id="525012668859298131" datatype="html">
<source>Settings were saved successfully. Reload is required to apply some changes.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">583</context>
+ <context context-type="linenumber">586</context>
</context-group>
</trans-unit>
<trans-unit id="8491974984518503778" datatype="html">
<source>Reload now</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">584</context>
+ <context context-type="linenumber">587</context>
</context-group>
</trans-unit>
<trans-unit id="6839066544204061364" datatype="html">
<source>Use system language</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">603</context>
+ <context context-type="linenumber">606</context>
</context-group>
</trans-unit>
<trans-unit id="7729897675462249787" datatype="html">
<source>Use date format of display language</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">610</context>
+ <context context-type="linenumber">613</context>
</context-group>
</trans-unit>
<trans-unit id="5260584511980773458" datatype="html">
<source>Error while storing settings on server.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">630</context>
+ <context context-type="linenumber">633</context>
</context-group>
</trans-unit>
<trans-unit id="4510369340305901516" datatype="html">
<source>Password has been changed, you will be logged out momentarily.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">662</context>
+ <context context-type="linenumber">676</context>
</context-group>
</trans-unit>
<trans-unit id="2753185112875184719" datatype="html">
<source>Saved user "<x id="PH" equiv-text="newUser.username"/>".</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">669</context>
+ <context context-type="linenumber">683</context>
</context-group>
</trans-unit>
<trans-unit id="3471101514724661554" datatype="html">
<source>Error saving user.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">681</context>
+ <context context-type="linenumber">695</context>
</context-group>
</trans-unit>
<trans-unit id="5565868288871970148" datatype="html">
<source>Confirm delete user account</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">692</context>
+ <context context-type="linenumber">706</context>
</context-group>
</trans-unit>
<trans-unit id="8133663925694885325" datatype="html">
<source>This operation will permanently delete this user account.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">693</context>
+ <context context-type="linenumber">707</context>
</context-group>
</trans-unit>
<trans-unit id="857903183180440990" datatype="html">
<source>Deleted user</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">702</context>
+ <context context-type="linenumber">716</context>
</context-group>
</trans-unit>
<trans-unit id="1942566571910298572" datatype="html">
<source>Error deleting user.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">710</context>
+ <context context-type="linenumber">724</context>
</context-group>
</trans-unit>
<trans-unit id="5766640174051730159" datatype="html">
<source>Saved group "<x id="PH" equiv-text="newGroup.name"/>".</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">731</context>
+ <context context-type="linenumber">745</context>
</context-group>
</trans-unit>
<trans-unit id="8382042988405122578" datatype="html">
<source>Error saving group.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">741</context>
+ <context context-type="linenumber">755</context>
</context-group>
</trans-unit>
<trans-unit id="6538873300613683004" datatype="html">
<source>Confirm delete user group</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">752</context>
+ <context context-type="linenumber">766</context>
</context-group>
</trans-unit>
<trans-unit id="7710984639498518244" datatype="html">
<source>This operation will permanently delete this user group.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">753</context>
+ <context context-type="linenumber">767</context>
</context-group>
</trans-unit>
<trans-unit id="6834066329827670963" datatype="html">
<source>Deleted group</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">762</context>
+ <context context-type="linenumber">776</context>
</context-group>
</trans-unit>
<trans-unit id="8850738980935204840" datatype="html">
<source>Error deleting group.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">770</context>
+ <context context-type="linenumber">784</context>
</context-group>
</trans-unit>
<trans-unit id="6327501535846658797" datatype="html">
<source>Saved account "<x id="PH" equiv-text="newMailAccount.name"/>".</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">796</context>
+ <context context-type="linenumber">810</context>
</context-group>
</trans-unit>
<trans-unit id="8067594003836508139" datatype="html">
<source>Error saving account.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">808</context>
+ <context context-type="linenumber">822</context>
</context-group>
</trans-unit>
<trans-unit id="5641934153807844674" datatype="html">
<source>Confirm delete mail account</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">819</context>
+ <context context-type="linenumber">833</context>
</context-group>
</trans-unit>
<trans-unit id="7176985344323395435" datatype="html">
<source>This operation will permanently delete this mail account.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">820</context>
+ <context context-type="linenumber">834</context>
</context-group>
</trans-unit>
<trans-unit id="4233826387148482123" datatype="html">
<source>Deleted mail account</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">829</context>
+ <context context-type="linenumber">843</context>
</context-group>
</trans-unit>
<trans-unit id="6202503362522392111" datatype="html">
<source>Error deleting mail account.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">838</context>
+ <context context-type="linenumber">852</context>
</context-group>
</trans-unit>
<trans-unit id="123368655395433699" datatype="html">
<source>Saved rule "<x id="PH" equiv-text="newMailRule.name"/>".</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">859</context>
+ <context context-type="linenumber">873</context>
</context-group>
</trans-unit>
<trans-unit id="8951124554918814321" datatype="html">
<source>Error saving rule.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">871</context>
+ <context context-type="linenumber">885</context>
</context-group>
</trans-unit>
<trans-unit id="3896080636020672118" datatype="html">
<source>Confirm delete mail rule</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">882</context>
+ <context context-type="linenumber">896</context>
</context-group>
</trans-unit>
<trans-unit id="2250372580580310337" datatype="html">
<source>This operation will permanently delete this mail rule.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">883</context>
+ <context context-type="linenumber">897</context>
</context-group>
</trans-unit>
<trans-unit id="9077981247971516916" datatype="html">
<source>Deleted mail rule</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">892</context>
+ <context context-type="linenumber">906</context>
</context-group>
</trans-unit>
<trans-unit id="2033194641751367552" datatype="html">
<source>Error deleting mail rule.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
- <context context-type="linenumber">901</context>
+ <context context-type="linenumber">915</context>
</context-group>
</trans-unit>
<trans-unit id="5101757640976222639" datatype="html">
import json
from unittest import mock
+from django.contrib.auth.models import Permission
from django.contrib.auth.models import User
+from guardian.shortcuts import assign_perm
from rest_framework import status
from rest_framework.test import APITestCase
super().setUp()
- self.user = User.objects.create_superuser(username="temp_admin")
+ self.user = User.objects.create_user(username="temp_admin")
+ self.user.user_permissions.add(*Permission.objects.all())
+ self.user.save()
self.client.force_authenticate(user=self.user)
def test_get_mail_accounts(self):
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data["success"], True)
+ def test_get_mail_accounts_owner_aware(self):
+ """
+ GIVEN:
+ - Configured accounts with different users
+ WHEN:
+ - API call is made to get mail accounts
+ THEN:
+ - Only unowned, owned by user or granted accounts are provided
+ """
+
+ user2 = User.objects.create_user(username="temp_admin2")
+
+ account1 = MailAccount.objects.create(
+ name="Email1",
+ username="username1",
+ password="password1",
+ imap_server="server.example.com",
+ imap_port=443,
+ imap_security=MailAccount.ImapSecurity.SSL,
+ character_set="UTF-8",
+ )
+
+ account2 = MailAccount.objects.create(
+ name="Email2",
+ username="username2",
+ password="password2",
+ imap_server="server.example.com",
+ imap_port=443,
+ imap_security=MailAccount.ImapSecurity.SSL,
+ character_set="UTF-8",
+ )
+ account2.owner = self.user
+ account2.save()
+
+ account3 = MailAccount.objects.create(
+ name="Email3",
+ username="username3",
+ password="password3",
+ imap_server="server.example.com",
+ imap_port=443,
+ imap_security=MailAccount.ImapSecurity.SSL,
+ character_set="UTF-8",
+ )
+ account3.owner = user2
+ account3.save()
+
+ account4 = MailAccount.objects.create(
+ name="Email4",
+ username="username4",
+ password="password4",
+ imap_server="server.example.com",
+ imap_port=443,
+ imap_security=MailAccount.ImapSecurity.SSL,
+ character_set="UTF-8",
+ )
+ account4.owner = user2
+ account4.save()
+ assign_perm("view_mailaccount", self.user, account4)
+
+ response = self.client.get(self.ENDPOINT)
+
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertEqual(response.data["count"], 3)
+ self.assertEqual(response.data["results"][0]["name"], account1.name)
+ self.assertEqual(response.data["results"][1]["name"], account2.name)
+ self.assertEqual(response.data["results"][2]["name"], account4.name)
+
class TestAPIMailRules(DirectoriesMixin, APITestCase):
ENDPOINT = "/api/mail_rules/"
def setUp(self):
super().setUp()
- self.user = User.objects.create_superuser(username="temp_admin")
+ self.user = User.objects.create_user(username="temp_admin")
+ self.user.user_permissions.add(*Permission.objects.all())
+ self.user.save()
self.client.force_authenticate(user=self.user)
def test_get_mail_rules(self):
returned_rule1 = MailRule.objects.get(pk=rule1.pk)
self.assertEqual(returned_rule1.name, "Updated Name 1")
self.assertEqual(returned_rule1.action, MailRule.MailAction.DELETE)
+
+ def test_get_mail_rules_owner_aware(self):
+ """
+ GIVEN:
+ - Configured rules with different users
+ WHEN:
+ - API call is made to get mail rules
+ THEN:
+ - Only unowned, owned by user or granted mail rules are provided
+ """
+
+ user2 = User.objects.create_user(username="temp_admin2")
+
+ account1 = MailAccount.objects.create(
+ name="Email1",
+ username="username1",
+ password="password1",
+ imap_server="server.example.com",
+ imap_port=443,
+ imap_security=MailAccount.ImapSecurity.SSL,
+ character_set="UTF-8",
+ )
+
+ rule1 = MailRule.objects.create(
+ name="Rule1",
+ account=account1,
+ folder="INBOX",
+ filter_from="from@example1.com",
+ order=0,
+ )
+
+ rule2 = MailRule.objects.create(
+ name="Rule2",
+ account=account1,
+ folder="INBOX",
+ filter_from="from@example2.com",
+ order=1,
+ )
+ rule2.owner = self.user
+ rule2.save()
+
+ rule3 = MailRule.objects.create(
+ name="Rule3",
+ account=account1,
+ folder="INBOX",
+ filter_from="from@example3.com",
+ order=2,
+ )
+ rule3.owner = user2
+ rule3.save()
+
+ rule4 = MailRule.objects.create(
+ name="Rule4",
+ account=account1,
+ folder="INBOX",
+ filter_from="from@example4.com",
+ order=3,
+ )
+ rule4.owner = user2
+ rule4.save()
+ assign_perm("view_mailrule", self.user, rule4)
+
+ response = self.client.get(self.ENDPOINT)
+
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertEqual(response.data["count"], 3)
+ self.assertEqual(response.data["results"][0]["name"], rule1.name)
+ self.assertEqual(response.data["results"][1]["name"], rule2.name)
+ self.assertEqual(response.data["results"][2]["name"], rule4.name)