Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/mailcow email lists #289

Merged
merged 57 commits into from
Aug 19, 2023
Merged

Feature/mailcow email lists #289

merged 57 commits into from
Aug 19, 2023

Conversation

EricTRL
Copy link
Contributor

@EricTRL EricTRL commented Nov 9, 2022

THIS BUILDS ON TOP OF THE CHANGES IN #282

Sending emails to all Squire members is complicated. While it is possible to export the membership file, copy all the email addresses, and paste them in the BCC, doing so is time-consuming and error-prone. Furthermore, all email aliases for committees need to be kept track of manually.

This feature aims for a few things:

  • Automatically sync Squire's member list to an email alias in Mailcow.
  • Ensure that this member-wide email alias can only be mailed to from our own domains.
  • Automatically create an email alias for committees and orders in Squire
  • Ensure that these commitee-wide email aliases can be mailed to from external domains as well.
  • Allow for the option to only create email aliases for some committees/orders, as some of them have their own mailbox instead.

Connecting to the mailcow API is possible and data can be properly read from it. Not all API endpoints are properly documented, but a somewhat good overview can be found here: https://mailcow.docs.apiary.io/#

For Rspamd settings specifically, their API endpoint was extracted manually by making requests in the Mailcow admin panel.

Note: Mailcow also uses an IP whitelist for its API in addition to an API key. Only ipv4 address can be added to this whitelist.
Changed file organisation.
Added an API route for changing rspamd setting maps (requires read/write API access).
Squire can read, update, or create an rspamd setting that marks an alias as 'internal'.
Inernal aliases can only be emailed from within the domain.
@EricTRL EricTRL added membership file Related to the membership file feature feature admin The Admin Panel for Back-end stuff downloads Newsletter and other downloadable content labels Nov 9, 2022
When a new member is added, or when the email address of an existing member changes, changes a "members"-alias in Mailcow.

Does not handle deletions yet, nor is it made "internal".
@codecov
Copy link

codecov bot commented Nov 10, 2022

Codecov Report

Patch coverage: 95.98% and project coverage change: +0.01% 🎉

Comparison is base (ed362f0) 95.84% compared to head (95505d3) 95.86%.

❗ Current head 95505d3 differs from pull request most recent head e050cc6. Consider uploading reports for the commit e050cc6 to get more accurate results

Additional details and impacted files
@@            Coverage Diff             @@
##           master     #289      +/-   ##
==========================================
+ Coverage   95.84%   95.86%   +0.01%     
==========================================
  Files         145      161      +16     
  Lines        6113     7106     +993     
  Branches      968     1164     +196     
==========================================
+ Hits         5859     6812     +953     
- Misses        174      193      +19     
- Partials       80      101      +21     
Flag Coverage Δ
unittests 95.86% <95.98%> (+0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files Changed Coverage Δ
user_interaction/views.py 83.01% <ø> (ø)
utils/viewcollectives.py 89.42% <85.00%> (-2.25%) ⬇️
mailcow_integration/signals.py 87.02% <87.02%> (ø)
core/status_collective.py 90.90% <90.90%> (ø)
mailcow_integration/account_pages/config.py 93.75% <93.75%> (ø)
mailcow_integration/admin_status/views.py 95.21% <95.21%> (ø)
mailcow_integration/api/client.py 97.22% <97.22%> (ø)
committees/committeecollective.py 97.67% <100.00%> (ø)
committees/models.py 100.00% <100.00%> (ø)
core/backends.py 100.00% <100.00%> (ø)
... and 16 more

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Added a status page listing all member aliases, and whether they are up-to-date.
Moved the mailcow config to a separate json file, and added this to the gitignore. Included a sample config to show the formatting.

Added a page that allows users to set their preferences for each of the member aliases. Aliases that do not allow opt-outs are still shown, though their settings are disabled.
Label-formatting is now already done at the preference itself, rather than its form.
Users' preferences now sync with Mailcow.
Added a button that updates all member preferences.

Member aliases are now finished, with the exception of proper error handling and additional verification (e.g. users setting a member-alias as their own email)
Also removed unused imports.
Allow updating and viewing the status of committee aliases. If an alias is not managed by Squire, it now instead lists the emails present in Mailcow.

Pre-existing mailboxes break the system, as Squire still attempts to create an alias for those.

Split off a separate alias-list template from the status template.
Added an interface for Mailcow Mailboxes (and friends).

Added a management command that allows retrieving responses from the Mailcow API.
Results for fetching mailboxes and aliases are cached.

If a member adds one of the member-aliases as their email address, then this email address is ignored.
If a committee alias address is identical to one of the member aliases, it is not updated. This is also reflected in the UI.
Aliases for which a mailbox with the same name exists are ignored. This is also indicated in the UI.
Internal aliases can still be emailed from outside the domain if another (non-internal) alias has the internal alias in its goto addresses.
A warning is now issued if this is the case, along with the "routes" that allow emailing internal aliases from outside.
Added archive addresses to the config. All aliases contain such an archive addresses.

The status page now also lists orphan data. That is, aliases that indicate they are managed by Squire, even though Squire doesn't actually use them.
Allows emailing all committees and workgroups through a single send-address.
Added tests for barebone requests and validation in the MailcowClient
Subscribed members are now retrieved properly, regardless of the default opt-in/opt-out status, even if they do not have explicit preferences set up.
Resolved code duplication by unifying data read by the template.
Uses the same interface/template as those for committees and global member-addresses.
Created a viewCollective for admin pages. Nextcloud status (not in this branch yet) can be added here later too.

Modified mentioned payment amount on membership extension page. This should be changed to a global preference later on.
Added various signals for detecting changes for Mailcow aliases.

Minor problem: Cascade deletes can cause multiple signals to run. For example, deleting a committee activates the deletion signal for the committee itself and for all attached members. This causes multiple (duplicate) requests to the API that aren't needed.
CASCADE deletion greatly complicates signal logic (see previous commit).

Deletion behaviour was set to PROTECT or SET_NULL where possible.
Added a global preference that disables all of the signals.

Global committee aliases no longer throw an exception in the status view.
Global committee aliases no longer blocklist themselves.
Alias deletion API updated. It does not match up with how it's done in the Mailcow admin panel though.
Untestable code does not count towards coverage.
Added new greeting lines.
committees/models.py Show resolved Hide resolved
def check_access_validity(self, request, association_group=None):
if not super(CommitteeBaseConfig, self).check_access_validity(request):
def is_accessible(self, request, association_group=None):
if not super(CommitteeBaseConfig, self).is_accessible(request):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I get why you did this namechange, but I think it conflicts with general property_naming. is_x is generally more used for get-properties. Similar to how you changed is_considered_member() to is_active on the Member model. That is why is purposely started with check_x. If you don't like the original name, maybe change it to validate_access() or something like that (i.e. a more active-sounding name)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess I'm a bit confused about the intent of the method in itself. Take this snippet in committees.committeecollective.CommitteeBaseConfig.is_accessible:

def is_accessible(self, request, association_group=None):
        if not super(CommitteeBaseConfig, self).is_accessible(request):
            return False

        if not user_in_association_group(request.user, association_group):
            raise PermissionDenied()

        # Check group permission
        if self.group_requires_permission is not None:
            app_label, codename = self.group_requires_permission.split('.', maxsplit=1)
            if not Permission.objects.filter(
                content_type__app_label=app_label,
                codename=codename,
                group__associationgroup=association_group
            ):  return False

        return True

In one case it raises an exception (user is not in the committee), while in other cases it returns a boolean (committee/group does not have a specific permission). Why the difference?
In some of the calling code the boolean value is checked, and a Permission-denied exception is raised if it's false. Right now there seems to be a bit of a mismatch somewhere.

but I think it conflicts with general property_naming. is_x is generally more used for get-properties

I disagree on this. Imo, method names should roughly indicate what they do and what is returned. My assumption that the return value of this method would always be a boolean wasn't correct though.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I may have to straighten that issue out. I agree that it should not work with both returning booleans and throw erros, that is just confusing. I'll do that in another PR though one day.

core/status_collective.py Show resolved Hide resolved
mailcow_integration/account_pages/views.py Outdated Show resolved Hide resolved
# Mailcow client must be set up if this view can be accessed
config = apps.get_app_config("mailcow_integration")
mailcow_client: SquireMailcowManager = config.mailcow_client
mailcow_client.update_member_aliases()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it not better to add this to the form?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed; views in general shouldn't make changes to the database themselves. Same goes for the statusview, which currently doesn't use a form class at all.

@@ -229,7 +252,8 @@ def __str__(self):

class Membership(models.Model):
""" Defines membership details of a member in a certain memberyear"""
member = models.ForeignKey(Member, on_delete=models.CASCADE)
# NULL-value allows keeping track of membership numbers over the years, even when members are deleted
member = models.ForeignKey(Member, on_delete=models.SET_NULL, null=True)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Sounds good, but check if it does not cause conflicts with the unique_together property as it could cause multiple null- instances to exist

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call. It seems like NULL-values aren't considered for unique_together. Judging from various StackOverflow threads that seems to be a common thing people don't realise.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you write a testcase to validate that (and catch any non-intended Django changes in the future?)

user_interaction/views.py Outdated Show resolved Hide resolved
utils/viewcollectives.py Outdated Show resolved Hide resolved
utils/viewcollectives.py Show resolved Hide resolved
mailcow_integration/squire_mailcow.py Show resolved Hide resolved
Tests various init_<foo>_alias_list methods.
Added tests for get_context_data.
Added tests for the status view's POST request handling.
Added a link to the server status page in the hamburger menu.

Addressed review comments.
Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remaining comments which cannot be posted as a review comment to avoid GitHub Rate Limit

blackfmt

mailcow_integration/admin_status/views.py|38|
mailcow_integration/admin_status/views.py|42 col 1|
mailcow_integration/admin_status/views.py|44|
mailcow_integration/admin_status/views.py|47|
mailcow_integration/admin_status/views.py|60 col 1|
mailcow_integration/admin_status/views.py|61|
mailcow_integration/admin_status/views.py|64 col 1|
mailcow_integration/admin_status/views.py|71|
mailcow_integration/admin_status/views.py|88|
mailcow_integration/admin_status/views.py|105|
mailcow_integration/admin_status/views.py|113|
mailcow_integration/admin_status/views.py|124|
mailcow_integration/admin_status/views.py|129|
mailcow_integration/admin_status/views.py|144|
mailcow_integration/admin_status/views.py|156|
mailcow_integration/admin_status/views.py|158|
mailcow_integration/admin_status/views.py|160|
mailcow_integration/admin_status/views.py|164|
mailcow_integration/admin_status/views.py|168|
mailcow_integration/admin_status/views.py|174|
mailcow_integration/admin_status/views.py|180|
mailcow_integration/admin_status/views.py|183|
mailcow_integration/admin_status/views.py|186|
mailcow_integration/admin_status/views.py|191|
mailcow_integration/admin_status/views.py|197|
mailcow_integration/admin_status/views.py|199|
mailcow_integration/admin_status/views.py|203|
mailcow_integration/admin_status/views.py|211|
mailcow_integration/admin_status/views.py|216|
mailcow_integration/admin_status/views.py|218|
mailcow_integration/admin_status/views.py|220|
mailcow_integration/admin_status/views.py|222|
mailcow_integration/admin_status/views.py|225|
mailcow_integration/admin_status/views.py|235|
mailcow_integration/admin_status/views.py|241|
mailcow_integration/admin_status/views.py|243|
mailcow_integration/admin_status/views.py|246|
mailcow_integration/admin_status/views.py|250|
mailcow_integration/admin_status/views.py|252|
mailcow_integration/admin_status/views.py|287 col 1|
mailcow_integration/admin_status/views.py|288|
mailcow_integration/api/client.py|14 col 1|
mailcow_integration/api/client.py|15|
mailcow_integration/api/client.py|19 col 1|
mailcow_integration/api/client.py|20|
mailcow_integration/api/client.py|24|
mailcow_integration/api/client.py|26|
mailcow_integration/api/client.py|31 col 1|
mailcow_integration/api/client.py|38|
mailcow_integration/api/client.py|46|
mailcow_integration/api/client.py|49|
mailcow_integration/api/client.py|54|
mailcow_integration/api/client.py|57|
mailcow_integration/api/client.py|63|
mailcow_integration/api/client.py|69|
mailcow_integration/api/client.py|71|
mailcow_integration/api/client.py|97|
mailcow_integration/api/client.py|102|
mailcow_integration/api/client.py|107|
mailcow_integration/api/client.py|111|
mailcow_integration/api/client.py|124|
mailcow_integration/api/client.py|126|
mailcow_integration/api/client.py|128|
mailcow_integration/api/client.py|130|
mailcow_integration/api/client.py|136|
mailcow_integration/api/client.py|139|
mailcow_integration/api/client.py|148|
mailcow_integration/api/client.py|150|
mailcow_integration/api/client.py|152|
mailcow_integration/api/client.py|154|
mailcow_integration/api/client.py|160|
mailcow_integration/api/client.py|175|
mailcow_integration/api/client.py|183|
mailcow_integration/api/client.py|188|
mailcow_integration/api/client.py|193|
mailcow_integration/api/client.py|195|
mailcow_integration/api/client.py|202|
mailcow_integration/api/client.py|207|
mailcow_integration/api/client.py|209|
mailcow_integration/api/exceptions.py|1|
mailcow_integration/api/exceptions.py|3|
mailcow_integration/api/exceptions.py|6|
mailcow_integration/api/exceptions.py|9|
mailcow_integration/api/exceptions.py|12|
mailcow_integration/api/exceptions.py|15|
mailcow_integration/api/exceptions.py|18|
mailcow_integration/api/interface/alias.py|9 col 1|
mailcow_integration/api/interface/alias.py|18|
mailcow_integration/api/interface/alias.py|24|
mailcow_integration/api/interface/alias.py|33|
mailcow_integration/api/interface/alias.py|55|
mailcow_integration/api/interface/base.py|3 col 1|
mailcow_integration/api/interface/base.py|4|
mailcow_integration/api/interface/base.py|8|
mailcow_integration/api/interface/mailbox.py|8 col 1|
mailcow_integration/api/interface/mailbox.py|9|
mailcow_integration/api/interface/mailbox.py|14 col 1|
mailcow_integration/api/interface/mailbox.py|15|
mailcow_integration/api/interface/mailbox.py|21 col 1|
mailcow_integration/api/interface/mailbox.py|22|
mailcow_integration/api/interface/mailbox.py|29|
mailcow_integration/api/interface/mailbox.py|39|
mailcow_integration/api/interface/mailbox.py|44|
mailcow_integration/api/interface/mailbox.py|63|
mailcow_integration/api/interface/mailbox.py|70|
mailcow_integration/api/interface/mailbox.py|72|
mailcow_integration/api/interface/mailbox.py|78|
mailcow_integration/api/interface/mailbox.py|87|
mailcow_integration/api/interface/mailbox.py|89|
mailcow_integration/api/interface/mailbox.py|98|
mailcow_integration/api/interface/mailbox.py|107|
mailcow_integration/api/interface/rspamd.py|6 col 1|
mailcow_integration/api/interface/rspamd.py|8|
mailcow_integration/api/interface/rspamd.py|11|
mailcow_integration/api/interface/rspamd.py|15|
mailcow_integration/apps.py|8 col 1|
mailcow_integration/apps.py|10 col 1|
mailcow_integration/apps.py|11|
mailcow_integration/apps.py|22|
mailcow_integration/apps.py|29|
mailcow_integration/dynamic_preferences_registry.py|10|
mailcow_integration/dynamic_preferences_registry.py|16|
mailcow_integration/dynamic_preferences_registry.py|18|
mailcow_integration/dynamic_preferences_registry.py|21 col 1|
mailcow_integration/dynamic_preferences_registry.py|22|
mailcow_integration/dynamic_preferences_registry.py|25 col 1|
mailcow_integration/dynamic_preferences_registry.py|26|
mailcow_integration/dynamic_preferences_registry.py|31|
mailcow_integration/dynamic_preferences_registry.py|33|
mailcow_integration/dynamic_preferences_registry.py|37|
mailcow_integration/dynamic_preferences_registry.py|41|
mailcow_integration/dynamic_preferences_registry.py|46|
mailcow_integration/dynamic_preferences_registry.py|52|
mailcow_integration/dynamic_preferences_registry.py|58|
mailcow_integration/dynamic_preferences_registry.py|61 col 1|
mailcow_integration/management/commands/mailcow_api_request.py|6|
mailcow_integration/management/commands/mailcow_api_request.py|10|
mailcow_integration/management/commands/mailcow_api_request.py|16|
mailcow_integration/signals.py|11|
mailcow_integration/signals.py|16|
mailcow_integration/signals.py|20 col 1|
mailcow_integration/signals.py|21|
mailcow_integration/signals.py|30 col 1|
mailcow_integration/signals.py|38 col 1|
mailcow_integration/signals.py|45 col 1|
mailcow_integration/signals.py|50|
mailcow_integration/signals.py|68 col 1|
mailcow_integration/signals.py|70|
mailcow_integration/signals.py|76|
mailcow_integration/signals.py|94 col 1|
mailcow_integration/signals.py|96|
mailcow_integration/signals.py|105 col 1|
mailcow_integration/signals.py|107|
mailcow_integration/signals.py|127|
mailcow_integration/signals.py|147 col 1|
mailcow_integration/signals.py|149|
mailcow_integration/signals.py|184 col 1|
mailcow_integration/signals.py|186|
mailcow_integration/signals.py|188|
mailcow_integration/signals.py|196 col 1|
mailcow_integration/signals.py|201|
mailcow_integration/signals.py|220 col 1|
mailcow_integration/signals.py|222|
mailcow_integration/signals.py|234|
mailcow_integration/signals.py|238|
mailcow_integration/signals.py|248 col 1|
mailcow_integration/signals.py|250|
mailcow_integration/signals.py|264|
mailcow_integration/signals.py|282 col 1|
mailcow_integration/signals.py|284|
mailcow_integration/signals.py|299 col 1|
mailcow_integration/signals.py|301|
mailcow_integration/signals.py|309 col 1|
mailcow_integration/signals.py|314|
mailcow_integration/signals.py|332 col 1|
mailcow_integration/signals.py|334|
mailcow_integration/signals.py|345|
mailcow_integration/signals.py|355 col 1|
mailcow_integration/signals.py|357|
mailcow_integration/signals.py|365 col 1|
mailcow_integration/signals.py|375|
mailcow_integration/signals.py|380|
mailcow_integration/signals.py|382|
mailcow_integration/signals.py|390|
mailcow_integration/squire_mailcow.py|21|
mailcow_integration/squire_mailcow.py|25 col 1|
mailcow_integration/squire_mailcow.py|26|
mailcow_integration/squire_mailcow.py|32|
mailcow_integration/squire_mailcow.py|37|
mailcow_integration/squire_mailcow.py|48 col 1|
mailcow_integration/squire_mailcow.py|64|
mailcow_integration/squire_mailcow.py|85|
mailcow_integration/squire_mailcow.py|91|
mailcow_integration/squire_mailcow.py|99|
mailcow_integration/squire_mailcow.py|105|
mailcow_integration/squire_mailcow.py|119|
mailcow_integration/squire_mailcow.py|144|
mailcow_integration/squire_mailcow.py|159|
mailcow_integration/squire_mailcow.py|167|
mailcow_integration/squire_mailcow.py|176|
mailcow_integration/squire_mailcow.py|180|
mailcow_integration/squire_mailcow.py|185|
mailcow_integration/squire_mailcow.py|189|
mailcow_integration/squire_mailcow.py|192|
mailcow_integration/squire_mailcow.py|209|
mailcow_integration/squire_mailcow.py|221|
mailcow_integration/squire_mailcow.py|228|
mailcow_integration/squire_mailcow.py|243|
mailcow_integration/squire_mailcow.py|246|
mailcow_integration/squire_mailcow.py|256|
mailcow_integration/squire_mailcow.py|271|
mailcow_integration/squire_mailcow.py|279|
mailcow_integration/squire_mailcow.py|292|
mailcow_integration/squire_mailcow.py|300|
mailcow_integration/squire_mailcow.py|304|
mailcow_integration/squire_mailcow.py|307|
mailcow_integration/squire_mailcow.py|317|
mailcow_integration/squire_mailcow.py|322|
mailcow_integration/squire_mailcow.py|324|
mailcow_integration/squire_mailcow.py|328|
mailcow_integration/tests/api/test_interfaces.py|6|
mailcow_integration/tests/api/test_interfaces.py|11|
mailcow_integration/tests/api/test_interfaces.py|30|
mailcow_integration/tests/api/test_interfaces.py|71|
mailcow_integration/tests/api/test_interfaces.py|81|
mailcow_integration/tests/api/test_interfaces.py|83|
mailcow_integration/tests/api/test_interfaces.py|90|
mailcow_integration/tests/api/test_interfaces.py|92|
mailcow_integration/tests/api/test_interfaces.py|100|
mailcow_integration/tests/api/test_interfaces.py|128|
mailcow_integration/tests/api/test_interfaces.py|133|
mailcow_integration/tests/api/tests_mailcow_client.py|23 col 1|
mailcow_integration/tests/api/tests_mailcow_client.py|24|
mailcow_integration/tests/api/tests_mailcow_client.py|31|
mailcow_integration/tests/api/tests_mailcow_client.py|34|
mailcow_integration/tests/api/tests_mailcow_client.py|38|
mailcow_integration/tests/api/tests_mailcow_client.py|46|
mailcow_integration/tests/api/tests_mailcow_client.py|48|
mailcow_integration/tests/api/tests_mailcow_client.py|50|
mailcow_integration/tests/api/tests_mailcow_client.py|55|
mailcow_integration/tests/api/tests_mailcow_client.py|62|
mailcow_integration/tests/api/tests_mailcow_client.py|66|
mailcow_integration/tests/api/tests_mailcow_client.py|75|
mailcow_integration/tests/api/tests_mailcow_client.py|80|
mailcow_integration/tests/api/tests_mailcow_client.py|87|
mailcow_integration/tests/api/tests_mailcow_client.py|89|
mailcow_integration/tests/api/tests_mailcow_client.py|91|
mailcow_integration/tests/api/tests_mailcow_client.py|93|
mailcow_integration/tests/api/tests_mailcow_client.py|96|
mailcow_integration/tests/api/tests_mailcow_client.py|100|
mailcow_integration/tests/api/tests_mailcow_client.py|107|
mailcow_integration/tests/api/tests_mailcow_client.py|114|
mailcow_integration/tests/api/tests_mailcow_client.py|121|
mailcow_integration/tests/api/tests_mailcow_client.py|128|
mailcow_integration/tests/api/tests_mailcow_client.py|135|
mailcow_integration/tests/api/tests_mailcow_client.py|142|
mailcow_integration/tests/api/tests_mailcow_client.py|152|
mailcow_integration/tests/api/tests_mailcow_client.py|157|
mailcow_integration/tests/api/tests_mailcow_client.py|168|
mailcow_integration/tests/api/tests_mailcow_client.py|172|
mailcow_integration/tests/api/tests_mailcow_client.py|182|
mailcow_integration/tests/api/tests_mailcow_client.py|187|
mailcow_integration/tests/api/tests_mailcow_client.py|199|
mailcow_integration/tests/api/tests_mailcow_client.py|212|
mailcow_integration/tests/api/tests_mailcow_client.py|221|
mailcow_integration/tests/api/tests_mailcow_client.py|234|
mailcow_integration/tests/api/tests_mailcow_client.py|240|
mailcow_integration/tests/api/tests_mailcow_client.py|242|
mailcow_integration/tests/api/tests_mailcow_client.py|247|
mailcow_integration/tests/api/tests_mailcow_client.py|253|
mailcow_integration/tests/api/tests_mailcow_client.py|255|
mailcow_integration/tests/api/tests_mailcow_client.py|260|
mailcow_integration/tests/api/tests_mailcow_client.py|265|
mailcow_integration/tests/api/tests_mailcow_client.py|277|
mailcow_integration/tests/api/tests_mailcow_client.py|287|
mailcow_integration/tests/api/tests_mailcow_client.py|296|
mailcow_integration/tests/api/tests_mailcow_client.py|306|
mailcow_integration/tests/api/tests_mailcow_client.py|312|
mailcow_integration/tests/api/tests_mailcow_client.py|314|
mailcow_integration/tests/api/tests_mailcow_client.py|319|
mailcow_integration/tests/api/tests_mailcow_client.py|325|
mailcow_integration/tests/api/tests_mailcow_client.py|327|
mailcow_integration/tests/api/tests_mailcow_client.py|332|
mailcow_integration/tests/api/tests_mailcow_client.py|339|
mailcow_integration/tests/api/tests_mailcow_client.py|356|
mailcow_integration/tests/api/tests_mailcow_client.py|361|
mailcow_integration/tests/api/tests_mailcow_client.py|372|
mailcow_integration/tests/api/tests_mailcow_client.py|376|
mailcow_integration/tests/api/tests_mailcow_client.py|381|
mailcow_integration/tests/api/tests_mailcow_client.py|393|
mailcow_integration/tests/api/tests_mailcow_client.py|397|
mailcow_integration/tests/api/tests_mailcow_client.py|407|
mailcow_integration/tests/api/tests_mailcow_client.py|410|
mailcow_integration/tests/api/tests_mailcow_client.py|422|
mailcow_integration/tests/api/tests_mailcow_client.py|432|
mailcow_integration/tests/api/tests_mailcow_client.py|435|
mailcow_integration/tests/api/tests_mailcow_client.py|447|
mailcow_integration/tests/tests_preferences.py|13 col 1|
mailcow_integration/tests/tests_preferences.py|14|
mailcow_integration/tests/tests_preferences.py|16|
mailcow_integration/tests/tests_preferences.py|23|
mailcow_integration/tests/tests_preferences.py|27|
mailcow_integration/tests/tests_preferences.py|31|
mailcow_integration/tests/tests_squire_mailcow.py|26|
mailcow_integration/tests/tests_squire_mailcow.py|32|
mailcow_integration/tests/tests_squire_mailcow.py|39|
mailcow_integration/tests/tests_squire_mailcow.py|45|
mailcow_integration/tests/tests_squire_mailcow.py|47|
mailcow_integration/tests/tests_squire_mailcow.py|53|
mailcow_integration/tests/tests_squire_mailcow.py|59|
mailcow_integration/tests/tests_squire_mailcow.py|63|
mailcow_integration/tests/tests_squire_mailcow.py|69|
mailcow_integration/tests/tests_squire_mailcow.py|73|
mailcow_integration/tests/tests_squire_mailcow.py|77|
mailcow_integration/tests/tests_squire_mailcow.py|81|
mailcow_integration/tests/tests_squire_mailcow.py|103|
mailcow_integration/tests/tests_squire_mailcow.py|107|
mailcow_integration/tests/tests_squire_mailcow.py|112|
mailcow_integration/tests/tests_squire_mailcow.py|134|
mailcow_integration/tests/tests_squire_mailcow.py|142|
mailcow_integration/tests/tests_squire_mailcow.py|150|
mailcow_integration/tests/tests_squire_mailcow.py|153|
mailcow_integration/tests/tests_squire_mailcow.py|156|
mailcow_integration/tests/tests_squire_mailcow.py|162|
mailcow_integration/tests/tests_squire_mailcow.py|173|
mailcow_integration/tests/tests_squire_mailcow.py|186|
mailcow_integration/tests/tests_squire_mailcow.py|193|
mailcow_integration/tests/tests_squire_mailcow.py|197|
mailcow_integration/tests/tests_squire_mailcow.py|207|
mailcow_integration/tests/tests_squire_mailcow.py|212|
mailcow_integration/tests/tests_squire_mailcow.py|228|
mailcow_integration/tests/tests_squire_mailcow.py|238|
mailcow_integration/tests/tests_squire_mailcow.py|243|
mailcow_integration/tests/tests_squire_mailcow.py|250|
mailcow_integration/tests/tests_squire_mailcow.py|259|
mailcow_integration/tests/tests_squire_mailcow.py|269|
mailcow_integration/tests/tests_squire_mailcow.py|274|
mailcow_integration/tests/tests_squire_mailcow.py|289|
mailcow_integration/tests/tests_squire_mailcow.py|298|
mailcow_integration/tests/tests_squire_mailcow.py|303|
mailcow_integration/tests/tests_squire_mailcow.py|318|
mailcow_integration/tests/tests_squire_mailcow.py|330|
mailcow_integration/tests/tests_squire_mailcow.py|335|
mailcow_integration/tests/tests_squire_mailcow.py|351|
mailcow_integration/tests/tests_squire_mailcow.py|358|
mailcow_integration/tests/tests_squire_mailcow.py|383|
mailcow_integration/tests/tests_squire_mailcow.py|395|
mailcow_integration/tests/tests_squire_mailcow.py|398|
mailcow_integration/tests/tests_squire_mailcow.py|400|
mailcow_integration/tests/tests_squire_mailcow.py|404|
mailcow_integration/tests/tests_squire_mailcow.py|413|
mailcow_integration/tests/tests_squire_mailcow.py|419|
mailcow_integration/tests/tests_squire_mailcow.py|438|
mailcow_integration/tests/tests_squire_mailcow.py|451|
mailcow_integration/tests/tests_squire_mailcow.py|467|
mailcow_integration/tests/tests_squire_mailcow.py|478|
mailcow_integration/tests/tests_squire_mailcow.py|481|
mailcow_integration/tests/tests_squire_mailcow.py|484|
mailcow_integration/tests/tests_squire_mailcow.py|491|
mailcow_integration/tests/tests_squire_mailcow.py|499|
mailcow_integration/tests/tests_squire_mailcow.py|507|
mailcow_integration/tests/tests_squire_mailcow.py|511|
mailcow_integration/tests/tests_squire_mailcow.py|513|
mailcow_integration/tests/tests_squire_mailcow.py|516|
mailcow_integration/tests/tests_squire_mailcow.py|525|
mailcow_integration/tests/tests_squire_mailcow.py|527|
mailcow_integration/tests/tests_squire_mailcow.py|530|
mailcow_integration/tests/tests_squire_mailcow.py|544|
mailcow_integration/tests/tests_squire_mailcow.py|549|
mailcow_integration/tests/tests_squire_mailcow.py|553|
mailcow_integration/tests/tests_squire_mailcow.py|556|
mailcow_integration/tests/tests_view_status.py|11|
mailcow_integration/tests/tests_view_status.py|25 col 1|
mailcow_integration/tests/tests_view_status.py|26|
mailcow_integration/tests/tests_view_status.py|28|
mailcow_integration/tests/tests_view_status.py|33 col 1|
mailcow_integration/tests/tests_view_status.py|34|
mailcow_integration/tests/tests_view_status.py|46|
mailcow_integration/tests/tests_view_status.py|51|
mailcow_integration/tests/tests_view_status.py|53|
mailcow_integration/tests/tests_view_status.py|59|
mailcow_integration/tests/tests_view_status.py|64|
mailcow_integration/tests/tests_view_status.py|66|
mailcow_integration/tests/tests_view_status.py|70|
mailcow_integration/tests/tests_view_status.py|77|
mailcow_integration/tests/tests_view_status.py|79|
mailcow_integration/tests/tests_view_status.py|85|
mailcow_integration/tests/tests_view_status.py|88|
mailcow_integration/tests/tests_view_status.py|95|
mailcow_integration/tests/tests_view_status.py|98|
mailcow_integration/tests/tests_view_status.py|105|
mailcow_integration/tests/tests_view_status.py|107|
mailcow_integration/tests/tests_view_status.py|116|
mailcow_integration/tests/tests_view_status.py|123|
mailcow_integration/tests/tests_view_status.py|126|
mailcow_integration/tests/tests_view_status.py|133|
mailcow_integration/tests/tests_view_status.py|135|
mailcow_integration/tests/tests_view_status.py|144|
mailcow_integration/tests/tests_view_status.py|150 col 1|
mailcow_integration/tests/tests_view_status.py|151|
mailcow_integration/tests/tests_view_status.py|153|
mailcow_integration/tests/tests_view_status.py|155|
mailcow_integration/tests/tests_view_status.py|161|
mailcow_integration/tests/tests_view_status.py|163|
mailcow_integration/tests/tests_view_status.py|167|
mailcow_integration/tests/tests_view_status.py|171|
mailcow_integration/tests/tests_view_status.py|174|
mailcow_integration/tests/tests_view_status.py|180|
mailcow_integration/tests/tests_view_status.py|184|
mailcow_integration/tests/tests_view_status.py|188|
mailcow_integration/tests/tests_view_status.py|191|
mailcow_integration/tests/tests_view_status.py|198|
mailcow_integration/tests/tests_view_status.py|207|
mailcow_integration/tests/tests_view_status.py|214|
mailcow_integration/tests/tests_view_status.py|218|
mailcow_integration/tests/tests_view_status.py|223|
mailcow_integration/tests/tests_view_status.py|230|
mailcow_integration/tests/tests_view_status.py|243|
mailcow_integration/tests/tests_view_status.py|270|
mailcow_integration/tests/tests_view_status.py|279|
mailcow_integration/tests/tests_view_status.py|285|
mailcow_integration/tests/tests_view_status.py|287|
mailcow_integration/tests/tests_view_status.py|291|
mailcow_integration/tests/tests_view_status.py|299|
mailcow_integration/tests/tests_view_status.py|314|
mailcow_integration/tests/tests_view_status.py|325|
mailcow_integration/tests/tests_view_status.py|339|
mailcow_integration/tests/tests_view_status.py|344|
mailcow_integration/tests/tests_view_status.py|348|
mailcow_integration/tests/tests_view_status.py|357|
mailcow_integration/tests/tests_view_status.py|372|
mailcow_integration/tests/tests_view_status.py|376|
mailcow_integration/tests/tests_view_status.py|381|
mailcow_integration/tests/tests_view_status.py|390|
mailcow_integration/tests/tests_view_status.py|400|
mailcow_integration/tests/tests_view_status.py|406|
mailcow_integration/tests/tests_view_status.py|415|
mailcow_integration/tests/tests_view_status.py|420|
mailcow_integration/tests/tests_view_status.py|431|
mailcow_integration/tests/tests_view_status.py|449|
mailcow_integration/tests/tests_view_status.py|464|
mailcow_integration/tests/tests_view_status.py|469|
mailcow_integration/tests/tests_view_status.py|475|
mailcow_integration/tests/tests_view_status.py|477|
mailcow_integration/tests/tests_view_status.py|481|
mailcow_integration/tests/tests_view_status.py|483|
mailcow_integration/tests/tests_view_status.py|487|
mailcow_integration/tests/tests_view_status.py|489|
mailcow_integration/tests/tests_view_status.py|492|
mailcow_integration/tests/tests_view_status.py|501|
mailcow_integration/tests/tests_view_status.py|517|
mailcow_integration/tests/tests_view_status.py|532|
mailcow_integration/tests/tests_view_status.py|547|
mailcow_integration/tests/tests_view_status.py|563|
mailcow_integration/tests/tests_view_status.py|576|
membership_file/models.py|19 col 1|
membership_file/models.py|21|
membership_file/models.py|25|
membership_file/models.py|33 col 1|
membership_file/models.py|41|
membership_file/models.py|149|
membership_file/models.py|253|
membership_file/models.py|257|
membership_file/models.py|264|
membership_file/models.py|268|
membership_file/tests/tests_model.py|13 col 1|
membership_file/tests/tests_model.py|14|
membership_file/tests/tests_model.py|17|
membership_file/tests/tests_model.py|26|
membership_file/tests/tests_model.py|31|
membership_file/tests/tests_model.py|42|
membership_file/tests/tests_model.py|51|
membership_file/tests/tests_model.py|67|
squire/settings.py|243|
squire/settings.py|375|
squire/settings.py|385|
squire/settings_mailcow.py|30|
squire/settings_mailcow.py|33|
squire/settings_mailcow.py|40|
utils/tests/test_views.py|139|
utils/tests/test_views.py|141 col 1|
utils/tests/test_views.py|170 col 1|
utils/tests/test_views.py|171|
utils/tests/test_views.py|181|
utils/tests/test_views.py|185|
utils/tests/test_views.py|191|
utils/tests/test_views.py|197|
utils/viewcollectives.py|57|
utils/viewcollectives.py|61|
utils/viewcollectives.py|65|
utils/viewcollectives.py|71|
utils/viewcollectives.py|77|
utils/viewcollectives.py|101 col 1|
utils/viewcollectives.py|103|
utils/viewcollectives.py|112|
utils/viewcollectives.py|156|
utils/viewcollectives.py|171|
utils/viewcollectives.py|207|
utils/viewcollectives.py|225|
utils/views.py|119|

@@ -84,9 +84,12 @@ class AssociationGroupMembership(models.Model):
For another we want additional information stored that is difficult when attempting to override the link between
user and group.
"""
member = models.ForeignKey(Member, on_delete=models.CASCADE, blank=True, null=True)
# PROTECT prevents accidental deletion of a member while it is still in a committee.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
# PROTECT prevents accidental deletion of a member while it is still in a committee.
# PROTECT prevents accidental deletion of a member while it is still in a committee.

# PROTECT prevents accidental deletion of a member while it is still in a committee.
# It also serves as a way to prevent deletion-signals to fire at the same
# time when a committee is deleted (once for member, and then the committee)
member = models.ForeignKey(Member, on_delete=models.PROTECT, blank=True, null=True)
external_person = models.CharField(max_length=64, help_text="Name of a person who is not a registered member", blank=True)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
external_person = models.CharField(max_length=64, help_text="Name of a person who is not a registered member", blank=True)
external_person = models.CharField(
max_length=64, help_text="Name of a person who is not a registered member", blank=True
)

@@ -30,26 +30,26 @@ def test_check_access_super(self):
# New request with no info WILL fail at the parent
request = RequestFactory().get(path='')
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
request = RequestFactory().get(path='')
request = RequestFactory().get(path="")


def test_check_access_without_permission_requirement(self):
self.assertEqual(self.config.check_access_validity(self.request, self.association_group), True)
self.assertEqual(self.config.is_accessible(self.request, self.association_group), True)

def test_check_access_permission_requirement_fails(self):
self.config.group_requires_permission = 'auth.change_user'
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
self.config.group_requires_permission = 'auth.change_user'
self.config.group_requires_permission = "auth.change_user"


def test_check_access_permission_requirement_fails(self):
self.config.group_requires_permission = 'auth.change_user'
self.assertEqual(self.config.check_access_validity(self.request, self.association_group), False)
self.assertEqual(self.config.is_accessible(self.request, self.association_group), False)

def test_check_access_permission_requirement_success(self):
self.config.group_requires_permission = 'auth.change_user'
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
self.config.group_requires_permission = 'auth.change_user'
self.config.group_requires_permission = "auth.change_user"


def get_urls(self):
return [
path('', MailcowTabbedStatusView.as_view(config=self), name='mailcow_status'),
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
path('', MailcowTabbedStatusView.as_view(config=self), name='mailcow_status'),
path("", MailcowTabbedStatusView.as_view(config=self), name="mailcow_status"),

from committees.models import AssociationGroup
from core.status_collective import AdminStatusViewMixin

from mailcow_integration.api.exceptions import MailcowAPIAccessDenied, MailcowAPIReadWriteAccessDenied, MailcowAuthException, MailcowException
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
from mailcow_integration.api.exceptions import MailcowAPIAccessDenied, MailcowAPIReadWriteAccessDenied, MailcowAuthException, MailcowException
from mailcow_integration.api.exceptions import (
MailcowAPIAccessDenied,
MailcowAPIReadWriteAccessDenied,
MailcowAuthException,
MailcowException,
)


logger = logging.getLogger(__name__)

class AliasStatus(Enum):
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
class AliasStatus(Enum):
class AliasStatus(Enum):

Comment on lines +26 to +27
""" Aliases that should exist according to Squire may not be in sync with those in Mailcow.
This Enum indicates the disparity between the two.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
""" Aliases that should exist according to Squire may not be in sync with those in Mailcow.
This Enum indicates the disparity between the two.
"""Aliases that should exist according to Squire may not be in sync with those in Mailcow.
This Enum indicates the disparity between the two.

Comment on lines +29 to +35
VALID = 0 # Squire and mailcow are in sync
MISSING = 1 # Alias is not in Mailcow, but should exist
NOT_MANAGED_BY_SQUIRE = 2 # Alias is in Mailcow, but does not have a public comment indicating it is managed by Squire
OUTDATED = 3 # Alias goto-addresses do not match up with Squire
RESERVED = 4 # Alias already reserved for a member-alias, but a committee has it as their contact info
MAILBOX = 5 # Mailbox with the same name already exists; not managed by Squire
ORPHAN = 6 # Alias is not needed by Squire, but existed in Mailcow
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
VALID = 0 # Squire and mailcow are in sync
MISSING = 1 # Alias is not in Mailcow, but should exist
NOT_MANAGED_BY_SQUIRE = 2 # Alias is in Mailcow, but does not have a public comment indicating it is managed by Squire
OUTDATED = 3 # Alias goto-addresses do not match up with Squire
RESERVED = 4 # Alias already reserved for a member-alias, but a committee has it as their contact info
MAILBOX = 5 # Mailbox with the same name already exists; not managed by Squire
ORPHAN = 6 # Alias is not needed by Squire, but existed in Mailcow
VALID = 0 # Squire and mailcow are in sync
MISSING = 1 # Alias is not in Mailcow, but should exist
NOT_MANAGED_BY_SQUIRE = (
2 # Alias is in Mailcow, but does not have a public comment indicating it is managed by Squire
)
OUTDATED = 3 # Alias goto-addresses do not match up with Squire
RESERVED = 4 # Alias already reserved for a member-alias, but a committee has it as their contact info
MAILBOX = 5 # Mailbox with the same name already exists; not managed by Squire
ORPHAN = 6 # Alias is not needed by Squire, but existed in Mailcow

Moved member aliases update call to a form when a member updates their email preferences.
Added tests for this form and the corresponding view.

Honorary members are considered active members.

Renamed is_accessble to is_accessible_for
Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remaining comments which cannot be posted as a review comment to avoid GitHub Rate Limit

blackfmt

mailcow_integration/admin_status/views.py|183|
mailcow_integration/admin_status/views.py|186|
mailcow_integration/admin_status/views.py|191|
mailcow_integration/admin_status/views.py|197|
mailcow_integration/admin_status/views.py|199|
mailcow_integration/admin_status/views.py|203|
mailcow_integration/admin_status/views.py|211|
mailcow_integration/admin_status/views.py|216|
mailcow_integration/admin_status/views.py|218|
mailcow_integration/admin_status/views.py|220|
mailcow_integration/admin_status/views.py|222|
mailcow_integration/admin_status/views.py|225|
mailcow_integration/admin_status/views.py|235|
mailcow_integration/admin_status/views.py|241|
mailcow_integration/admin_status/views.py|243|
mailcow_integration/admin_status/views.py|246|
mailcow_integration/admin_status/views.py|250|
mailcow_integration/admin_status/views.py|252|
mailcow_integration/admin_status/views.py|287 col 1|
mailcow_integration/admin_status/views.py|288|
mailcow_integration/api/client.py|14 col 1|
mailcow_integration/api/client.py|15|
mailcow_integration/api/client.py|19 col 1|
mailcow_integration/api/client.py|20|
mailcow_integration/api/client.py|24|
mailcow_integration/api/client.py|26|
mailcow_integration/api/client.py|31 col 1|
mailcow_integration/api/client.py|38|
mailcow_integration/api/client.py|46|
mailcow_integration/api/client.py|49|
mailcow_integration/api/client.py|54|
mailcow_integration/api/client.py|57|
mailcow_integration/api/client.py|63|
mailcow_integration/api/client.py|69|
mailcow_integration/api/client.py|71|
mailcow_integration/api/client.py|97|
mailcow_integration/api/client.py|102|
mailcow_integration/api/client.py|107|
mailcow_integration/api/client.py|111|
mailcow_integration/api/client.py|124|
mailcow_integration/api/client.py|126|
mailcow_integration/api/client.py|128|
mailcow_integration/api/client.py|130|
mailcow_integration/api/client.py|136|
mailcow_integration/api/client.py|139|
mailcow_integration/api/client.py|148|
mailcow_integration/api/client.py|150|
mailcow_integration/api/client.py|152|
mailcow_integration/api/client.py|154|
mailcow_integration/api/client.py|160|
mailcow_integration/api/client.py|175|
mailcow_integration/api/client.py|183|
mailcow_integration/api/client.py|188|
mailcow_integration/api/client.py|193|
mailcow_integration/api/client.py|195|
mailcow_integration/api/client.py|202|
mailcow_integration/api/client.py|207|
mailcow_integration/api/client.py|209|
mailcow_integration/api/exceptions.py|1|
mailcow_integration/api/exceptions.py|3|
mailcow_integration/api/exceptions.py|6|
mailcow_integration/api/exceptions.py|9|
mailcow_integration/api/exceptions.py|12|
mailcow_integration/api/exceptions.py|15|
mailcow_integration/api/exceptions.py|18|
mailcow_integration/api/interface/alias.py|9 col 1|
mailcow_integration/api/interface/alias.py|18|
mailcow_integration/api/interface/alias.py|24|
mailcow_integration/api/interface/alias.py|33|
mailcow_integration/api/interface/alias.py|55|
mailcow_integration/api/interface/base.py|3 col 1|
mailcow_integration/api/interface/base.py|4|
mailcow_integration/api/interface/base.py|8|
mailcow_integration/api/interface/mailbox.py|8 col 1|
mailcow_integration/api/interface/mailbox.py|9|
mailcow_integration/api/interface/mailbox.py|14 col 1|
mailcow_integration/api/interface/mailbox.py|15|
mailcow_integration/api/interface/mailbox.py|21 col 1|
mailcow_integration/api/interface/mailbox.py|22|
mailcow_integration/api/interface/mailbox.py|29|
mailcow_integration/api/interface/mailbox.py|39|
mailcow_integration/api/interface/mailbox.py|44|
mailcow_integration/api/interface/mailbox.py|63|
mailcow_integration/api/interface/mailbox.py|70|
mailcow_integration/api/interface/mailbox.py|72|
mailcow_integration/api/interface/mailbox.py|78|
mailcow_integration/api/interface/mailbox.py|87|
mailcow_integration/api/interface/mailbox.py|89|
mailcow_integration/api/interface/mailbox.py|98|
mailcow_integration/api/interface/mailbox.py|107|
mailcow_integration/api/interface/rspamd.py|6 col 1|
mailcow_integration/api/interface/rspamd.py|8|
mailcow_integration/api/interface/rspamd.py|11|
mailcow_integration/api/interface/rspamd.py|15|
mailcow_integration/apps.py|8 col 1|
mailcow_integration/apps.py|10 col 1|
mailcow_integration/apps.py|11|
mailcow_integration/apps.py|22|
mailcow_integration/apps.py|29|
mailcow_integration/dynamic_preferences_registry.py|10|
mailcow_integration/dynamic_preferences_registry.py|16|
mailcow_integration/dynamic_preferences_registry.py|18|
mailcow_integration/dynamic_preferences_registry.py|21 col 1|
mailcow_integration/dynamic_preferences_registry.py|22|
mailcow_integration/dynamic_preferences_registry.py|25 col 1|
mailcow_integration/dynamic_preferences_registry.py|26|
mailcow_integration/dynamic_preferences_registry.py|31|
mailcow_integration/dynamic_preferences_registry.py|33|
mailcow_integration/dynamic_preferences_registry.py|37|
mailcow_integration/dynamic_preferences_registry.py|41|
mailcow_integration/dynamic_preferences_registry.py|46|
mailcow_integration/dynamic_preferences_registry.py|52|
mailcow_integration/dynamic_preferences_registry.py|58|
mailcow_integration/dynamic_preferences_registry.py|61 col 1|
mailcow_integration/management/commands/mailcow_api_request.py|6|
mailcow_integration/management/commands/mailcow_api_request.py|10|
mailcow_integration/management/commands/mailcow_api_request.py|16|
mailcow_integration/signals.py|11|
mailcow_integration/signals.py|16|
mailcow_integration/signals.py|20 col 1|
mailcow_integration/signals.py|21|
mailcow_integration/signals.py|30 col 1|
mailcow_integration/signals.py|38 col 1|
mailcow_integration/signals.py|45 col 1|
mailcow_integration/signals.py|50|
mailcow_integration/signals.py|68 col 1|
mailcow_integration/signals.py|70|
mailcow_integration/signals.py|76|
mailcow_integration/signals.py|91 col 1|
mailcow_integration/signals.py|93|
mailcow_integration/signals.py|102 col 1|
mailcow_integration/signals.py|104|
mailcow_integration/signals.py|121|
mailcow_integration/signals.py|141 col 1|
mailcow_integration/signals.py|143|
mailcow_integration/signals.py|178 col 1|
mailcow_integration/signals.py|180|
mailcow_integration/signals.py|182|
mailcow_integration/signals.py|190 col 1|
mailcow_integration/signals.py|195|
mailcow_integration/signals.py|214 col 1|
mailcow_integration/signals.py|216|
mailcow_integration/signals.py|228|
mailcow_integration/signals.py|232|
mailcow_integration/signals.py|242 col 1|
mailcow_integration/signals.py|244|
mailcow_integration/signals.py|258|
mailcow_integration/signals.py|276 col 1|
mailcow_integration/signals.py|278|
mailcow_integration/signals.py|293 col 1|
mailcow_integration/signals.py|295|
mailcow_integration/signals.py|303 col 1|
mailcow_integration/signals.py|308|
mailcow_integration/signals.py|326 col 1|
mailcow_integration/signals.py|328|
mailcow_integration/signals.py|339|
mailcow_integration/signals.py|353 col 1|
mailcow_integration/signals.py|355|
mailcow_integration/signals.py|365 col 1|
mailcow_integration/signals.py|375|
mailcow_integration/signals.py|380|
mailcow_integration/signals.py|382|
mailcow_integration/signals.py|390|
mailcow_integration/squire_mailcow.py|21|
mailcow_integration/squire_mailcow.py|25 col 1|
mailcow_integration/squire_mailcow.py|26|
mailcow_integration/squire_mailcow.py|32|
mailcow_integration/squire_mailcow.py|37|
mailcow_integration/squire_mailcow.py|48 col 1|
mailcow_integration/squire_mailcow.py|64|
mailcow_integration/squire_mailcow.py|85|
mailcow_integration/squire_mailcow.py|91|
mailcow_integration/squire_mailcow.py|99|
mailcow_integration/squire_mailcow.py|105|
mailcow_integration/squire_mailcow.py|119|
mailcow_integration/squire_mailcow.py|144|
mailcow_integration/squire_mailcow.py|159|
mailcow_integration/squire_mailcow.py|167|
mailcow_integration/squire_mailcow.py|176|
mailcow_integration/squire_mailcow.py|180|
mailcow_integration/squire_mailcow.py|185|
mailcow_integration/squire_mailcow.py|189|
mailcow_integration/squire_mailcow.py|192|
mailcow_integration/squire_mailcow.py|209|
mailcow_integration/squire_mailcow.py|221|
mailcow_integration/squire_mailcow.py|228|
mailcow_integration/squire_mailcow.py|243|
mailcow_integration/squire_mailcow.py|246|
mailcow_integration/squire_mailcow.py|256|
mailcow_integration/squire_mailcow.py|271|
mailcow_integration/squire_mailcow.py|279|
mailcow_integration/squire_mailcow.py|292|
mailcow_integration/squire_mailcow.py|300|
mailcow_integration/squire_mailcow.py|304|
mailcow_integration/squire_mailcow.py|307|
mailcow_integration/squire_mailcow.py|317|
mailcow_integration/squire_mailcow.py|322|
mailcow_integration/squire_mailcow.py|324|
mailcow_integration/squire_mailcow.py|328|
mailcow_integration/tests/api/test_interfaces.py|6|
mailcow_integration/tests/api/test_interfaces.py|11|
mailcow_integration/tests/api/test_interfaces.py|30|
mailcow_integration/tests/api/test_interfaces.py|71|
mailcow_integration/tests/api/test_interfaces.py|81|
mailcow_integration/tests/api/test_interfaces.py|83|
mailcow_integration/tests/api/test_interfaces.py|90|
mailcow_integration/tests/api/test_interfaces.py|92|
mailcow_integration/tests/api/test_interfaces.py|100|
mailcow_integration/tests/api/test_interfaces.py|128|
mailcow_integration/tests/api/test_interfaces.py|133|
mailcow_integration/tests/api/tests_mailcow_client.py|23 col 1|
mailcow_integration/tests/api/tests_mailcow_client.py|24|
mailcow_integration/tests/api/tests_mailcow_client.py|31|
mailcow_integration/tests/api/tests_mailcow_client.py|34|
mailcow_integration/tests/api/tests_mailcow_client.py|38|
mailcow_integration/tests/api/tests_mailcow_client.py|46|
mailcow_integration/tests/api/tests_mailcow_client.py|48|
mailcow_integration/tests/api/tests_mailcow_client.py|50|
mailcow_integration/tests/api/tests_mailcow_client.py|55|
mailcow_integration/tests/api/tests_mailcow_client.py|62|
mailcow_integration/tests/api/tests_mailcow_client.py|66|
mailcow_integration/tests/api/tests_mailcow_client.py|75|
mailcow_integration/tests/api/tests_mailcow_client.py|80|
mailcow_integration/tests/api/tests_mailcow_client.py|87|
mailcow_integration/tests/api/tests_mailcow_client.py|89|
mailcow_integration/tests/api/tests_mailcow_client.py|91|
mailcow_integration/tests/api/tests_mailcow_client.py|93|
mailcow_integration/tests/api/tests_mailcow_client.py|96|
mailcow_integration/tests/api/tests_mailcow_client.py|100|
mailcow_integration/tests/api/tests_mailcow_client.py|107|
mailcow_integration/tests/api/tests_mailcow_client.py|114|
mailcow_integration/tests/api/tests_mailcow_client.py|121|
mailcow_integration/tests/api/tests_mailcow_client.py|128|
mailcow_integration/tests/api/tests_mailcow_client.py|135|
mailcow_integration/tests/api/tests_mailcow_client.py|142|
mailcow_integration/tests/api/tests_mailcow_client.py|152|
mailcow_integration/tests/api/tests_mailcow_client.py|157|
mailcow_integration/tests/api/tests_mailcow_client.py|168|
mailcow_integration/tests/api/tests_mailcow_client.py|172|
mailcow_integration/tests/api/tests_mailcow_client.py|182|
mailcow_integration/tests/api/tests_mailcow_client.py|187|
mailcow_integration/tests/api/tests_mailcow_client.py|199|
mailcow_integration/tests/api/tests_mailcow_client.py|212|
mailcow_integration/tests/api/tests_mailcow_client.py|221|
mailcow_integration/tests/api/tests_mailcow_client.py|234|
mailcow_integration/tests/api/tests_mailcow_client.py|240|
mailcow_integration/tests/api/tests_mailcow_client.py|242|
mailcow_integration/tests/api/tests_mailcow_client.py|247|
mailcow_integration/tests/api/tests_mailcow_client.py|253|
mailcow_integration/tests/api/tests_mailcow_client.py|255|
mailcow_integration/tests/api/tests_mailcow_client.py|260|
mailcow_integration/tests/api/tests_mailcow_client.py|265|
mailcow_integration/tests/api/tests_mailcow_client.py|277|
mailcow_integration/tests/api/tests_mailcow_client.py|287|
mailcow_integration/tests/api/tests_mailcow_client.py|296|
mailcow_integration/tests/api/tests_mailcow_client.py|306|
mailcow_integration/tests/api/tests_mailcow_client.py|312|
mailcow_integration/tests/api/tests_mailcow_client.py|314|
mailcow_integration/tests/api/tests_mailcow_client.py|319|
mailcow_integration/tests/api/tests_mailcow_client.py|325|
mailcow_integration/tests/api/tests_mailcow_client.py|327|
mailcow_integration/tests/api/tests_mailcow_client.py|332|
mailcow_integration/tests/api/tests_mailcow_client.py|339|
mailcow_integration/tests/api/tests_mailcow_client.py|356|
mailcow_integration/tests/api/tests_mailcow_client.py|361|
mailcow_integration/tests/api/tests_mailcow_client.py|372|
mailcow_integration/tests/api/tests_mailcow_client.py|376|
mailcow_integration/tests/api/tests_mailcow_client.py|381|
mailcow_integration/tests/api/tests_mailcow_client.py|393|
mailcow_integration/tests/api/tests_mailcow_client.py|397|
mailcow_integration/tests/api/tests_mailcow_client.py|407|
mailcow_integration/tests/api/tests_mailcow_client.py|410|
mailcow_integration/tests/api/tests_mailcow_client.py|422|
mailcow_integration/tests/api/tests_mailcow_client.py|432|
mailcow_integration/tests/api/tests_mailcow_client.py|435|
mailcow_integration/tests/api/tests_mailcow_client.py|447|
mailcow_integration/tests/tests_member_preferences.py|13|
mailcow_integration/tests/tests_member_preferences.py|24|
mailcow_integration/tests/tests_member_preferences.py|27|
mailcow_integration/tests/tests_member_preferences.py|35|
mailcow_integration/tests/tests_member_preferences.py|38|
mailcow_integration/tests/tests_member_preferences.py|44|
mailcow_integration/tests/tests_member_preferences.py|46|
mailcow_integration/tests/tests_member_preferences.py|48|
mailcow_integration/tests/tests_member_preferences.py|56|
mailcow_integration/tests/tests_member_preferences.py|58|
mailcow_integration/tests/tests_member_preferences.py|60|
mailcow_integration/tests/tests_preferences.py|13 col 1|
mailcow_integration/tests/tests_preferences.py|14|
mailcow_integration/tests/tests_preferences.py|16|
mailcow_integration/tests/tests_preferences.py|23|
mailcow_integration/tests/tests_preferences.py|27|
mailcow_integration/tests/tests_preferences.py|31|
mailcow_integration/tests/tests_squire_mailcow.py|26|
mailcow_integration/tests/tests_squire_mailcow.py|32|
mailcow_integration/tests/tests_squire_mailcow.py|39|
mailcow_integration/tests/tests_squire_mailcow.py|45|
mailcow_integration/tests/tests_squire_mailcow.py|47|
mailcow_integration/tests/tests_squire_mailcow.py|53|
mailcow_integration/tests/tests_squire_mailcow.py|59|
mailcow_integration/tests/tests_squire_mailcow.py|63|
mailcow_integration/tests/tests_squire_mailcow.py|69|
mailcow_integration/tests/tests_squire_mailcow.py|73|
mailcow_integration/tests/tests_squire_mailcow.py|77|
mailcow_integration/tests/tests_squire_mailcow.py|81|
mailcow_integration/tests/tests_squire_mailcow.py|103|
mailcow_integration/tests/tests_squire_mailcow.py|107|
mailcow_integration/tests/tests_squire_mailcow.py|112|
mailcow_integration/tests/tests_squire_mailcow.py|134|
mailcow_integration/tests/tests_squire_mailcow.py|142|
mailcow_integration/tests/tests_squire_mailcow.py|150|
mailcow_integration/tests/tests_squire_mailcow.py|153|
mailcow_integration/tests/tests_squire_mailcow.py|156|
mailcow_integration/tests/tests_squire_mailcow.py|162|
mailcow_integration/tests/tests_squire_mailcow.py|173|
mailcow_integration/tests/tests_squire_mailcow.py|186|
mailcow_integration/tests/tests_squire_mailcow.py|193|
mailcow_integration/tests/tests_squire_mailcow.py|197|
mailcow_integration/tests/tests_squire_mailcow.py|207|
mailcow_integration/tests/tests_squire_mailcow.py|212|
mailcow_integration/tests/tests_squire_mailcow.py|228|
mailcow_integration/tests/tests_squire_mailcow.py|238|
mailcow_integration/tests/tests_squire_mailcow.py|243|
mailcow_integration/tests/tests_squire_mailcow.py|250|
mailcow_integration/tests/tests_squire_mailcow.py|259|
mailcow_integration/tests/tests_squire_mailcow.py|269|
mailcow_integration/tests/tests_squire_mailcow.py|274|
mailcow_integration/tests/tests_squire_mailcow.py|289|
mailcow_integration/tests/tests_squire_mailcow.py|298|
mailcow_integration/tests/tests_squire_mailcow.py|303|
mailcow_integration/tests/tests_squire_mailcow.py|318|
mailcow_integration/tests/tests_squire_mailcow.py|330|
mailcow_integration/tests/tests_squire_mailcow.py|335|
mailcow_integration/tests/tests_squire_mailcow.py|351|
mailcow_integration/tests/tests_squire_mailcow.py|358|
mailcow_integration/tests/tests_squire_mailcow.py|383|
mailcow_integration/tests/tests_squire_mailcow.py|395|
mailcow_integration/tests/tests_squire_mailcow.py|398|
mailcow_integration/tests/tests_squire_mailcow.py|400|
mailcow_integration/tests/tests_squire_mailcow.py|404|
mailcow_integration/tests/tests_squire_mailcow.py|413|
mailcow_integration/tests/tests_squire_mailcow.py|419|
mailcow_integration/tests/tests_squire_mailcow.py|438|
mailcow_integration/tests/tests_squire_mailcow.py|451|
mailcow_integration/tests/tests_squire_mailcow.py|467|
mailcow_integration/tests/tests_squire_mailcow.py|478|
mailcow_integration/tests/tests_squire_mailcow.py|481|
mailcow_integration/tests/tests_squire_mailcow.py|484|
mailcow_integration/tests/tests_squire_mailcow.py|491|
mailcow_integration/tests/tests_squire_mailcow.py|499|
mailcow_integration/tests/tests_squire_mailcow.py|507|
mailcow_integration/tests/tests_squire_mailcow.py|511|
mailcow_integration/tests/tests_squire_mailcow.py|513|
mailcow_integration/tests/tests_squire_mailcow.py|516|
mailcow_integration/tests/tests_squire_mailcow.py|525|
mailcow_integration/tests/tests_squire_mailcow.py|527|
mailcow_integration/tests/tests_squire_mailcow.py|530|
mailcow_integration/tests/tests_squire_mailcow.py|544|
mailcow_integration/tests/tests_squire_mailcow.py|549|
mailcow_integration/tests/tests_squire_mailcow.py|553|
mailcow_integration/tests/tests_squire_mailcow.py|556|
mailcow_integration/tests/tests_view_status.py|11|
mailcow_integration/tests/tests_view_status.py|25 col 1|
mailcow_integration/tests/tests_view_status.py|26|
mailcow_integration/tests/tests_view_status.py|28|
mailcow_integration/tests/tests_view_status.py|33 col 1|
mailcow_integration/tests/tests_view_status.py|34|
mailcow_integration/tests/tests_view_status.py|46|
mailcow_integration/tests/tests_view_status.py|51|
mailcow_integration/tests/tests_view_status.py|53|
mailcow_integration/tests/tests_view_status.py|59|
mailcow_integration/tests/tests_view_status.py|64|
mailcow_integration/tests/tests_view_status.py|66|
mailcow_integration/tests/tests_view_status.py|70|
mailcow_integration/tests/tests_view_status.py|77|
mailcow_integration/tests/tests_view_status.py|79|
mailcow_integration/tests/tests_view_status.py|85|
mailcow_integration/tests/tests_view_status.py|88|
mailcow_integration/tests/tests_view_status.py|95|
mailcow_integration/tests/tests_view_status.py|98|
mailcow_integration/tests/tests_view_status.py|105|
mailcow_integration/tests/tests_view_status.py|107|
mailcow_integration/tests/tests_view_status.py|116|
mailcow_integration/tests/tests_view_status.py|123|
mailcow_integration/tests/tests_view_status.py|126|
mailcow_integration/tests/tests_view_status.py|133|
mailcow_integration/tests/tests_view_status.py|135|
mailcow_integration/tests/tests_view_status.py|144|
mailcow_integration/tests/tests_view_status.py|150 col 1|
mailcow_integration/tests/tests_view_status.py|151|
mailcow_integration/tests/tests_view_status.py|153|
mailcow_integration/tests/tests_view_status.py|155|
mailcow_integration/tests/tests_view_status.py|161|
mailcow_integration/tests/tests_view_status.py|163|
mailcow_integration/tests/tests_view_status.py|167|
mailcow_integration/tests/tests_view_status.py|171|
mailcow_integration/tests/tests_view_status.py|174|
mailcow_integration/tests/tests_view_status.py|180|
mailcow_integration/tests/tests_view_status.py|184|
mailcow_integration/tests/tests_view_status.py|188|
mailcow_integration/tests/tests_view_status.py|191|
mailcow_integration/tests/tests_view_status.py|198|
mailcow_integration/tests/tests_view_status.py|207|
mailcow_integration/tests/tests_view_status.py|214|
mailcow_integration/tests/tests_view_status.py|218|
mailcow_integration/tests/tests_view_status.py|223|
mailcow_integration/tests/tests_view_status.py|230|
mailcow_integration/tests/tests_view_status.py|243|
mailcow_integration/tests/tests_view_status.py|270|
mailcow_integration/tests/tests_view_status.py|279|
mailcow_integration/tests/tests_view_status.py|285|
mailcow_integration/tests/tests_view_status.py|287|
mailcow_integration/tests/tests_view_status.py|291|
mailcow_integration/tests/tests_view_status.py|299|
mailcow_integration/tests/tests_view_status.py|314|
mailcow_integration/tests/tests_view_status.py|325|
mailcow_integration/tests/tests_view_status.py|339|
mailcow_integration/tests/tests_view_status.py|344|
mailcow_integration/tests/tests_view_status.py|348|
mailcow_integration/tests/tests_view_status.py|357|
mailcow_integration/tests/tests_view_status.py|372|
mailcow_integration/tests/tests_view_status.py|376|
mailcow_integration/tests/tests_view_status.py|381|
mailcow_integration/tests/tests_view_status.py|390|
mailcow_integration/tests/tests_view_status.py|400|
mailcow_integration/tests/tests_view_status.py|406|
mailcow_integration/tests/tests_view_status.py|415|
mailcow_integration/tests/tests_view_status.py|420|
mailcow_integration/tests/tests_view_status.py|431|
mailcow_integration/tests/tests_view_status.py|449|
mailcow_integration/tests/tests_view_status.py|464|
mailcow_integration/tests/tests_view_status.py|469|
mailcow_integration/tests/tests_view_status.py|475|
mailcow_integration/tests/tests_view_status.py|477|
mailcow_integration/tests/tests_view_status.py|481|
mailcow_integration/tests/tests_view_status.py|483|
mailcow_integration/tests/tests_view_status.py|487|
mailcow_integration/tests/tests_view_status.py|489|
mailcow_integration/tests/tests_view_status.py|492|
mailcow_integration/tests/tests_view_status.py|501|
mailcow_integration/tests/tests_view_status.py|517|
mailcow_integration/tests/tests_view_status.py|532|
mailcow_integration/tests/tests_view_status.py|547|
mailcow_integration/tests/tests_view_status.py|563|
mailcow_integration/tests/tests_view_status.py|576|
membership_file/models.py|19 col 1|
membership_file/models.py|21|
membership_file/models.py|27|
membership_file/models.py|36 col 1|
membership_file/models.py|44|
membership_file/models.py|152|
membership_file/models.py|260|
membership_file/models.py|264|
membership_file/models.py|271|
membership_file/models.py|275|
membership_file/tests/tests_model.py|13 col 1|
membership_file/tests/tests_model.py|14|
membership_file/tests/tests_model.py|17|
membership_file/tests/tests_model.py|26|
membership_file/tests/tests_model.py|31|
membership_file/tests/tests_model.py|42|
membership_file/tests/tests_model.py|51|
membership_file/tests/tests_model.py|67|
squire/settings.py|243|
squire/settings.py|375|
squire/settings.py|385|
squire/settings_mailcow.py|30|
squire/settings_mailcow.py|33|
squire/settings_mailcow.py|40|
utils/tests/test_views.py|139|
utils/tests/test_views.py|141 col 1|
utils/tests/test_views.py|170 col 1|
utils/tests/test_views.py|171|
utils/tests/test_views.py|181|
utils/tests/test_views.py|185|
utils/tests/test_views.py|191|
utils/tests/test_views.py|197|
utils/viewcollectives.py|57|
utils/viewcollectives.py|61|
utils/viewcollectives.py|65|
utils/viewcollectives.py|71|
utils/viewcollectives.py|77|
utils/viewcollectives.py|101 col 1|
utils/viewcollectives.py|103|
utils/viewcollectives.py|112|
utils/viewcollectives.py|156|
utils/viewcollectives.py|171|
utils/viewcollectives.py|207|
utils/viewcollectives.py|225|
utils/views.py|119|


def get_urls(self):
return [
path('', TabbedEmailPreferencesChangeView.as_view(config=self), name='email_preferences'),

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
path('', TabbedEmailPreferencesChangeView.as_view(config=self), name='email_preferences'),
path("", TabbedEmailPreferencesChangeView.as_view(config=self), name="email_preferences"),


from mailcow_integration.squire_mailcow import SquireMailcowManager, get_mailcow_manager

class MemberMailPreferencesForm(UserPreferenceForm):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
class MemberMailPreferencesForm(UserPreferenceForm):
class MemberMailPreferencesForm(UserPreferenceForm):

Comment on lines +9 to +10
""" Form that allows changing member mail preferences """
def __init__(self, *args, mailcow_manager:SquireMailcowManager=None, **kwargs):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
""" Form that allows changing member mail preferences """
def __init__(self, *args, mailcow_manager:SquireMailcowManager=None, **kwargs):
"""Form that allows changing member mail preferences"""
def __init__(self, *args, mailcow_manager: SquireMailcowManager = None, **kwargs):

super().__init__(*args, **kwargs)

def update_preferences(self, **kwargs):
""" Update mail preferences and invokes the SquireMailcowManager """

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
""" Update mail preferences and invokes the SquireMailcowManager """
"""Update mail preferences and invokes the SquireMailcowManager"""


from user_interaction.accountcollective import AccountViewMixin

class EmailPreferencesChangeView(FormView):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
class EmailPreferencesChangeView(FormView):
class EmailPreferencesChangeView(FormView):

Comment on lines +160 to +161
status, alias, mailbox = self._get_alias_status(address, subscribers, AliasCategory.MEMBER,
aliases, mailboxes, self.mailcow_manager.ALIAS_MEMBERS_PUBLIC_COMMENT)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
status, alias, mailbox = self._get_alias_status(address, subscribers, AliasCategory.MEMBER,
aliases, mailboxes, self.mailcow_manager.ALIAS_MEMBERS_PUBLIC_COMMENT)

aliases, mailboxes, self.mailcow_manager.ALIAS_MEMBERS_PUBLIC_COMMENT)

exposure_routes = []
if config['internal']:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
if config['internal']:
if config["internal"]:

Comment on lines +168 to +169
info = AliasInfos(status.name, subscribers, address, "m_" + alias_address_to_id(address), config['title'], config['description'],
alias or mailbox, config['internal'], exposure_routes, config['allow_opt_out'], archive_addresses=config['archive_addresses']

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
info = AliasInfos(status.name, subscribers, address, "m_" + alias_address_to_id(address), config['title'], config['description'],
alias or mailbox, config['internal'], exposure_routes, config['allow_opt_out'], archive_addresses=config['archive_addresses']
info = AliasInfos(
status.name,
subscribers,
address,
"m_" + alias_address_to_id(address),
config["title"],
config["description"],
alias or mailbox,
config["internal"],
exposure_routes,
config["allow_opt_out"],
archive_addresses=config["archive_addresses"],

Comment on lines +174 to +175
def _init_global_committee_alias_list(self, aliases: List[MailcowAlias], mailboxes: List[MailcowMailbox]) -> List[AliasInfos]:
""" Initialize global committee aliases. e.g. commissies@example.com """

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
def _init_global_committee_alias_list(self, aliases: List[MailcowAlias], mailboxes: List[MailcowMailbox]) -> List[AliasInfos]:
""" Initialize global committee aliases. e.g. commissies@example.com """
def _init_global_committee_alias_list(
self, aliases: List[MailcowAlias], mailboxes: List[MailcowMailbox]
) -> List[AliasInfos]:
"""Initialize global committee aliases. e.g. commissies@example.com"""

Comment on lines +180 to +181
status, alias, mailbox = self._get_alias_status(address, subscribers, AliasCategory.GLOBAL_COMMITTEE,
aliases, mailboxes, self.mailcow_manager.ALIAS_GLOBAL_COMMITTEE_PUBLIC_COMMENT)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
status, alias, mailbox = self._get_alias_status(address, subscribers, AliasCategory.GLOBAL_COMMITTEE,
aliases, mailboxes, self.mailcow_manager.ALIAS_GLOBAL_COMMITTEE_PUBLIC_COMMENT)
status, alias, mailbox = self._get_alias_status(
address,
subscribers,
AliasCategory.GLOBAL_COMMITTEE,
aliases,
mailboxes,
self.mailcow_manager.ALIAS_GLOBAL_COMMITTEE_PUBLIC_COMMENT,
)

Added tests for alias signals, fixing a small collection of related bugs in the process.
Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remaining comments which cannot be posted as a review comment to avoid GitHub Rate Limit

blackfmt

mailcow_integration/api/client.py|54|
mailcow_integration/api/client.py|57|
mailcow_integration/api/client.py|63|
mailcow_integration/api/client.py|69|
mailcow_integration/api/client.py|71|
mailcow_integration/api/client.py|97|
mailcow_integration/api/client.py|102|
mailcow_integration/api/client.py|107|
mailcow_integration/api/client.py|111|
mailcow_integration/api/client.py|124|
mailcow_integration/api/client.py|126|
mailcow_integration/api/client.py|128|
mailcow_integration/api/client.py|130|
mailcow_integration/api/client.py|136|
mailcow_integration/api/client.py|139|
mailcow_integration/api/client.py|148|
mailcow_integration/api/client.py|150|
mailcow_integration/api/client.py|152|
mailcow_integration/api/client.py|154|
mailcow_integration/api/client.py|160|
mailcow_integration/api/client.py|175|
mailcow_integration/api/client.py|183|
mailcow_integration/api/client.py|188|
mailcow_integration/api/client.py|193|
mailcow_integration/api/client.py|195|
mailcow_integration/api/client.py|202|
mailcow_integration/api/client.py|207|
mailcow_integration/api/client.py|209|
mailcow_integration/api/exceptions.py|1|
mailcow_integration/api/exceptions.py|3|
mailcow_integration/api/exceptions.py|6|
mailcow_integration/api/exceptions.py|9|
mailcow_integration/api/exceptions.py|12|
mailcow_integration/api/exceptions.py|15|
mailcow_integration/api/exceptions.py|18|
mailcow_integration/api/interface/alias.py|9 col 1|
mailcow_integration/api/interface/alias.py|18|
mailcow_integration/api/interface/alias.py|24|
mailcow_integration/api/interface/alias.py|33|
mailcow_integration/api/interface/alias.py|55|
mailcow_integration/api/interface/base.py|3 col 1|
mailcow_integration/api/interface/base.py|4|
mailcow_integration/api/interface/base.py|8|
mailcow_integration/api/interface/mailbox.py|8 col 1|
mailcow_integration/api/interface/mailbox.py|9|
mailcow_integration/api/interface/mailbox.py|14 col 1|
mailcow_integration/api/interface/mailbox.py|15|
mailcow_integration/api/interface/mailbox.py|21 col 1|
mailcow_integration/api/interface/mailbox.py|22|
mailcow_integration/api/interface/mailbox.py|29|
mailcow_integration/api/interface/mailbox.py|39|
mailcow_integration/api/interface/mailbox.py|44|
mailcow_integration/api/interface/mailbox.py|63|
mailcow_integration/api/interface/mailbox.py|70|
mailcow_integration/api/interface/mailbox.py|72|
mailcow_integration/api/interface/mailbox.py|78|
mailcow_integration/api/interface/mailbox.py|87|
mailcow_integration/api/interface/mailbox.py|89|
mailcow_integration/api/interface/mailbox.py|98|
mailcow_integration/api/interface/mailbox.py|107|
mailcow_integration/api/interface/rspamd.py|6 col 1|
mailcow_integration/api/interface/rspamd.py|8|
mailcow_integration/api/interface/rspamd.py|11|
mailcow_integration/api/interface/rspamd.py|15|
mailcow_integration/apps.py|8 col 1|
mailcow_integration/apps.py|10 col 1|
mailcow_integration/apps.py|11|
mailcow_integration/apps.py|22|
mailcow_integration/apps.py|29|
mailcow_integration/dynamic_preferences_registry.py|10|
mailcow_integration/dynamic_preferences_registry.py|16|
mailcow_integration/dynamic_preferences_registry.py|18|
mailcow_integration/dynamic_preferences_registry.py|21 col 1|
mailcow_integration/dynamic_preferences_registry.py|22|
mailcow_integration/dynamic_preferences_registry.py|25 col 1|
mailcow_integration/dynamic_preferences_registry.py|26|
mailcow_integration/dynamic_preferences_registry.py|31|
mailcow_integration/dynamic_preferences_registry.py|33|
mailcow_integration/dynamic_preferences_registry.py|37|
mailcow_integration/dynamic_preferences_registry.py|41|
mailcow_integration/dynamic_preferences_registry.py|46|
mailcow_integration/dynamic_preferences_registry.py|52|
mailcow_integration/dynamic_preferences_registry.py|58|
mailcow_integration/dynamic_preferences_registry.py|61 col 1|
mailcow_integration/management/commands/mailcow_api_request.py|6|
mailcow_integration/management/commands/mailcow_api_request.py|10|
mailcow_integration/management/commands/mailcow_api_request.py|16|
mailcow_integration/signals.py|11|
mailcow_integration/signals.py|16|
mailcow_integration/signals.py|20 col 1|
mailcow_integration/signals.py|21|
mailcow_integration/signals.py|30 col 1|
mailcow_integration/signals.py|38 col 1|
mailcow_integration/signals.py|45 col 1|
mailcow_integration/signals.py|50|
mailcow_integration/signals.py|68 col 1|
mailcow_integration/signals.py|70|
mailcow_integration/signals.py|76|
mailcow_integration/signals.py|92 col 1|
mailcow_integration/signals.py|94|
mailcow_integration/signals.py|112|
mailcow_integration/signals.py|132 col 1|
mailcow_integration/signals.py|134|
mailcow_integration/signals.py|167|
mailcow_integration/signals.py|177 col 1|
mailcow_integration/signals.py|179|
mailcow_integration/signals.py|181|
mailcow_integration/signals.py|189 col 1|
mailcow_integration/signals.py|194|
mailcow_integration/signals.py|213 col 1|
mailcow_integration/signals.py|215|
mailcow_integration/signals.py|226|
mailcow_integration/signals.py|231|
mailcow_integration/signals.py|242 col 1|
mailcow_integration/signals.py|244|
mailcow_integration/signals.py|257|
mailcow_integration/signals.py|275 col 1|
mailcow_integration/signals.py|277|
mailcow_integration/signals.py|284|
mailcow_integration/signals.py|299 col 1|
mailcow_integration/signals.py|301|
mailcow_integration/signals.py|309 col 1|
mailcow_integration/signals.py|314|
mailcow_integration/signals.py|332 col 1|
mailcow_integration/signals.py|334|
mailcow_integration/signals.py|345|
mailcow_integration/signals.py|362 col 1|
mailcow_integration/signals.py|364|
mailcow_integration/signals.py|371 col 1|
mailcow_integration/signals.py|373|
mailcow_integration/signals.py|383 col 1|
mailcow_integration/signals.py|392|
mailcow_integration/signals.py|397|
mailcow_integration/signals.py|399|
mailcow_integration/signals.py|407|
mailcow_integration/squire_mailcow.py|21|
mailcow_integration/squire_mailcow.py|25 col 1|
mailcow_integration/squire_mailcow.py|26|
mailcow_integration/squire_mailcow.py|32|
mailcow_integration/squire_mailcow.py|37|
mailcow_integration/squire_mailcow.py|48 col 1|
mailcow_integration/squire_mailcow.py|64|
mailcow_integration/squire_mailcow.py|85|
mailcow_integration/squire_mailcow.py|91|
mailcow_integration/squire_mailcow.py|99|
mailcow_integration/squire_mailcow.py|105|
mailcow_integration/squire_mailcow.py|119|
mailcow_integration/squire_mailcow.py|144|
mailcow_integration/squire_mailcow.py|159|
mailcow_integration/squire_mailcow.py|167|
mailcow_integration/squire_mailcow.py|176|
mailcow_integration/squire_mailcow.py|180|
mailcow_integration/squire_mailcow.py|185|
mailcow_integration/squire_mailcow.py|189|
mailcow_integration/squire_mailcow.py|192|
mailcow_integration/squire_mailcow.py|209|
mailcow_integration/squire_mailcow.py|221|
mailcow_integration/squire_mailcow.py|228|
mailcow_integration/squire_mailcow.py|243|
mailcow_integration/squire_mailcow.py|246|
mailcow_integration/squire_mailcow.py|256|
mailcow_integration/squire_mailcow.py|271|
mailcow_integration/squire_mailcow.py|279|
mailcow_integration/squire_mailcow.py|292|
mailcow_integration/squire_mailcow.py|300|
mailcow_integration/squire_mailcow.py|304|
mailcow_integration/squire_mailcow.py|307|
mailcow_integration/squire_mailcow.py|317|
mailcow_integration/squire_mailcow.py|322|
mailcow_integration/squire_mailcow.py|324|
mailcow_integration/squire_mailcow.py|328|
mailcow_integration/tests/api/test_interfaces.py|6|
mailcow_integration/tests/api/test_interfaces.py|11|
mailcow_integration/tests/api/test_interfaces.py|30|
mailcow_integration/tests/api/test_interfaces.py|71|
mailcow_integration/tests/api/test_interfaces.py|81|
mailcow_integration/tests/api/test_interfaces.py|83|
mailcow_integration/tests/api/test_interfaces.py|90|
mailcow_integration/tests/api/test_interfaces.py|92|
mailcow_integration/tests/api/test_interfaces.py|100|
mailcow_integration/tests/api/test_interfaces.py|128|
mailcow_integration/tests/api/test_interfaces.py|133|
mailcow_integration/tests/api/tests_mailcow_client.py|23 col 1|
mailcow_integration/tests/api/tests_mailcow_client.py|24|
mailcow_integration/tests/api/tests_mailcow_client.py|31|
mailcow_integration/tests/api/tests_mailcow_client.py|34|
mailcow_integration/tests/api/tests_mailcow_client.py|38|
mailcow_integration/tests/api/tests_mailcow_client.py|46|
mailcow_integration/tests/api/tests_mailcow_client.py|48|
mailcow_integration/tests/api/tests_mailcow_client.py|50|
mailcow_integration/tests/api/tests_mailcow_client.py|55|
mailcow_integration/tests/api/tests_mailcow_client.py|62|
mailcow_integration/tests/api/tests_mailcow_client.py|66|
mailcow_integration/tests/api/tests_mailcow_client.py|75|
mailcow_integration/tests/api/tests_mailcow_client.py|80|
mailcow_integration/tests/api/tests_mailcow_client.py|87|
mailcow_integration/tests/api/tests_mailcow_client.py|89|
mailcow_integration/tests/api/tests_mailcow_client.py|91|
mailcow_integration/tests/api/tests_mailcow_client.py|93|
mailcow_integration/tests/api/tests_mailcow_client.py|96|
mailcow_integration/tests/api/tests_mailcow_client.py|100|
mailcow_integration/tests/api/tests_mailcow_client.py|107|
mailcow_integration/tests/api/tests_mailcow_client.py|114|
mailcow_integration/tests/api/tests_mailcow_client.py|121|
mailcow_integration/tests/api/tests_mailcow_client.py|128|
mailcow_integration/tests/api/tests_mailcow_client.py|135|
mailcow_integration/tests/api/tests_mailcow_client.py|142|
mailcow_integration/tests/api/tests_mailcow_client.py|152|
mailcow_integration/tests/api/tests_mailcow_client.py|157|
mailcow_integration/tests/api/tests_mailcow_client.py|168|
mailcow_integration/tests/api/tests_mailcow_client.py|172|
mailcow_integration/tests/api/tests_mailcow_client.py|182|
mailcow_integration/tests/api/tests_mailcow_client.py|187|
mailcow_integration/tests/api/tests_mailcow_client.py|199|
mailcow_integration/tests/api/tests_mailcow_client.py|212|
mailcow_integration/tests/api/tests_mailcow_client.py|221|
mailcow_integration/tests/api/tests_mailcow_client.py|234|
mailcow_integration/tests/api/tests_mailcow_client.py|240|
mailcow_integration/tests/api/tests_mailcow_client.py|242|
mailcow_integration/tests/api/tests_mailcow_client.py|247|
mailcow_integration/tests/api/tests_mailcow_client.py|253|
mailcow_integration/tests/api/tests_mailcow_client.py|255|
mailcow_integration/tests/api/tests_mailcow_client.py|260|
mailcow_integration/tests/api/tests_mailcow_client.py|265|
mailcow_integration/tests/api/tests_mailcow_client.py|277|
mailcow_integration/tests/api/tests_mailcow_client.py|287|
mailcow_integration/tests/api/tests_mailcow_client.py|296|
mailcow_integration/tests/api/tests_mailcow_client.py|306|
mailcow_integration/tests/api/tests_mailcow_client.py|312|
mailcow_integration/tests/api/tests_mailcow_client.py|314|
mailcow_integration/tests/api/tests_mailcow_client.py|319|
mailcow_integration/tests/api/tests_mailcow_client.py|325|
mailcow_integration/tests/api/tests_mailcow_client.py|327|
mailcow_integration/tests/api/tests_mailcow_client.py|332|
mailcow_integration/tests/api/tests_mailcow_client.py|339|
mailcow_integration/tests/api/tests_mailcow_client.py|356|
mailcow_integration/tests/api/tests_mailcow_client.py|361|
mailcow_integration/tests/api/tests_mailcow_client.py|372|
mailcow_integration/tests/api/tests_mailcow_client.py|376|
mailcow_integration/tests/api/tests_mailcow_client.py|381|
mailcow_integration/tests/api/tests_mailcow_client.py|393|
mailcow_integration/tests/api/tests_mailcow_client.py|397|
mailcow_integration/tests/api/tests_mailcow_client.py|407|
mailcow_integration/tests/api/tests_mailcow_client.py|410|
mailcow_integration/tests/api/tests_mailcow_client.py|422|
mailcow_integration/tests/api/tests_mailcow_client.py|432|
mailcow_integration/tests/api/tests_mailcow_client.py|435|
mailcow_integration/tests/api/tests_mailcow_client.py|447|
mailcow_integration/tests/tests_member_preferences.py|13|
mailcow_integration/tests/tests_member_preferences.py|24|
mailcow_integration/tests/tests_member_preferences.py|27|
mailcow_integration/tests/tests_member_preferences.py|35|
mailcow_integration/tests/tests_member_preferences.py|38|
mailcow_integration/tests/tests_member_preferences.py|44|
mailcow_integration/tests/tests_member_preferences.py|46|
mailcow_integration/tests/tests_member_preferences.py|48|
mailcow_integration/tests/tests_member_preferences.py|56|
mailcow_integration/tests/tests_member_preferences.py|58|
mailcow_integration/tests/tests_member_preferences.py|60|
mailcow_integration/tests/tests_preferences.py|13 col 1|
mailcow_integration/tests/tests_preferences.py|14|
mailcow_integration/tests/tests_preferences.py|16|
mailcow_integration/tests/tests_preferences.py|23|
mailcow_integration/tests/tests_preferences.py|27|
mailcow_integration/tests/tests_preferences.py|31|
mailcow_integration/tests/tests_signals.py|12 col 1|
mailcow_integration/tests/tests_signals.py|13|
mailcow_integration/tests/tests_signals.py|31 col 1|
mailcow_integration/tests/tests_signals.py|34 col 1|
mailcow_integration/tests/tests_signals.py|46|
mailcow_integration/tests/tests_signals.py|53|
mailcow_integration/tests/tests_signals.py|66|
mailcow_integration/tests/tests_signals.py|70|
mailcow_integration/tests/tests_signals.py|77|
mailcow_integration/tests/tests_signals.py|79|
mailcow_integration/tests/tests_signals.py|81|
mailcow_integration/tests/tests_signals.py|86|
mailcow_integration/tests/tests_signals.py|91|
mailcow_integration/tests/tests_signals.py|111|
mailcow_integration/tests/tests_signals.py|120|
mailcow_integration/tests/tests_signals.py|127|
mailcow_integration/tests/tests_signals.py|129|
mailcow_integration/tests/tests_signals.py|143|
mailcow_integration/tests/tests_signals.py|150|
mailcow_integration/tests/tests_signals.py|217|
mailcow_integration/tests/tests_signals.py|219|
mailcow_integration/tests/tests_signals.py|237|
mailcow_integration/tests/tests_signals.py|244|
mailcow_integration/tests/tests_signals.py|251|
mailcow_integration/tests/tests_signals.py|253|
mailcow_integration/tests/tests_signals.py|257|
mailcow_integration/tests/tests_signals.py|282|
mailcow_integration/tests/tests_signals.py|315|
mailcow_integration/tests/tests_signals.py|317|
mailcow_integration/tests/tests_signals.py|324|
mailcow_integration/tests/tests_signals.py|331|
mailcow_integration/tests/tests_signals.py|338|
mailcow_integration/tests/tests_signals.py|340|
mailcow_integration/tests/tests_signals.py|358|
mailcow_integration/tests/tests_signals.py|376|
mailcow_integration/tests/tests_signals.py|391|
mailcow_integration/tests/tests_signals.py|398|
mailcow_integration/tests/tests_signals.py|400|
mailcow_integration/tests/tests_signals.py|403|
mailcow_integration/tests/tests_signals.py|429|
mailcow_integration/tests/tests_signals.py|433|
mailcow_integration/tests/tests_signals.py|480|
mailcow_integration/tests/tests_signals.py|483|
mailcow_integration/tests/tests_squire_mailcow.py|26|
mailcow_integration/tests/tests_squire_mailcow.py|32|
mailcow_integration/tests/tests_squire_mailcow.py|39|
mailcow_integration/tests/tests_squire_mailcow.py|45|
mailcow_integration/tests/tests_squire_mailcow.py|47|
mailcow_integration/tests/tests_squire_mailcow.py|53|
mailcow_integration/tests/tests_squire_mailcow.py|59|
mailcow_integration/tests/tests_squire_mailcow.py|63|
mailcow_integration/tests/tests_squire_mailcow.py|69|
mailcow_integration/tests/tests_squire_mailcow.py|73|
mailcow_integration/tests/tests_squire_mailcow.py|77|
mailcow_integration/tests/tests_squire_mailcow.py|81|
mailcow_integration/tests/tests_squire_mailcow.py|103|
mailcow_integration/tests/tests_squire_mailcow.py|107|
mailcow_integration/tests/tests_squire_mailcow.py|112|
mailcow_integration/tests/tests_squire_mailcow.py|134|
mailcow_integration/tests/tests_squire_mailcow.py|142|
mailcow_integration/tests/tests_squire_mailcow.py|150|
mailcow_integration/tests/tests_squire_mailcow.py|153|
mailcow_integration/tests/tests_squire_mailcow.py|156|
mailcow_integration/tests/tests_squire_mailcow.py|162|
mailcow_integration/tests/tests_squire_mailcow.py|173|
mailcow_integration/tests/tests_squire_mailcow.py|186|
mailcow_integration/tests/tests_squire_mailcow.py|193|
mailcow_integration/tests/tests_squire_mailcow.py|197|
mailcow_integration/tests/tests_squire_mailcow.py|207|
mailcow_integration/tests/tests_squire_mailcow.py|212|
mailcow_integration/tests/tests_squire_mailcow.py|228|
mailcow_integration/tests/tests_squire_mailcow.py|238|
mailcow_integration/tests/tests_squire_mailcow.py|243|
mailcow_integration/tests/tests_squire_mailcow.py|250|
mailcow_integration/tests/tests_squire_mailcow.py|259|
mailcow_integration/tests/tests_squire_mailcow.py|269|
mailcow_integration/tests/tests_squire_mailcow.py|274|
mailcow_integration/tests/tests_squire_mailcow.py|289|
mailcow_integration/tests/tests_squire_mailcow.py|298|
mailcow_integration/tests/tests_squire_mailcow.py|303|
mailcow_integration/tests/tests_squire_mailcow.py|318|
mailcow_integration/tests/tests_squire_mailcow.py|330|
mailcow_integration/tests/tests_squire_mailcow.py|335|
mailcow_integration/tests/tests_squire_mailcow.py|351|
mailcow_integration/tests/tests_squire_mailcow.py|358|
mailcow_integration/tests/tests_squire_mailcow.py|383|
mailcow_integration/tests/tests_squire_mailcow.py|395|
mailcow_integration/tests/tests_squire_mailcow.py|398|
mailcow_integration/tests/tests_squire_mailcow.py|400|
mailcow_integration/tests/tests_squire_mailcow.py|404|
mailcow_integration/tests/tests_squire_mailcow.py|413|
mailcow_integration/tests/tests_squire_mailcow.py|419|
mailcow_integration/tests/tests_squire_mailcow.py|438|
mailcow_integration/tests/tests_squire_mailcow.py|451|
mailcow_integration/tests/tests_squire_mailcow.py|475|
mailcow_integration/tests/tests_squire_mailcow.py|478|
mailcow_integration/tests/tests_squire_mailcow.py|481|
mailcow_integration/tests/tests_squire_mailcow.py|484|
mailcow_integration/tests/tests_squire_mailcow.py|491|
mailcow_integration/tests/tests_squire_mailcow.py|499|
mailcow_integration/tests/tests_squire_mailcow.py|508|
mailcow_integration/tests/tests_squire_mailcow.py|512|
mailcow_integration/tests/tests_squire_mailcow.py|514|
mailcow_integration/tests/tests_squire_mailcow.py|517|
mailcow_integration/tests/tests_squire_mailcow.py|526|
mailcow_integration/tests/tests_squire_mailcow.py|528|
mailcow_integration/tests/tests_squire_mailcow.py|531|
mailcow_integration/tests/tests_squire_mailcow.py|546|
mailcow_integration/tests/tests_squire_mailcow.py|551|
mailcow_integration/tests/tests_squire_mailcow.py|555|
mailcow_integration/tests/tests_squire_mailcow.py|558|
mailcow_integration/tests/tests_view_status.py|11|
mailcow_integration/tests/tests_view_status.py|25 col 1|
mailcow_integration/tests/tests_view_status.py|26|
mailcow_integration/tests/tests_view_status.py|28|
mailcow_integration/tests/tests_view_status.py|33 col 1|
mailcow_integration/tests/tests_view_status.py|34|
mailcow_integration/tests/tests_view_status.py|46|
mailcow_integration/tests/tests_view_status.py|51|
mailcow_integration/tests/tests_view_status.py|53|
mailcow_integration/tests/tests_view_status.py|59|
mailcow_integration/tests/tests_view_status.py|64|
mailcow_integration/tests/tests_view_status.py|66|
mailcow_integration/tests/tests_view_status.py|70|
mailcow_integration/tests/tests_view_status.py|77|
mailcow_integration/tests/tests_view_status.py|79|
mailcow_integration/tests/tests_view_status.py|85|
mailcow_integration/tests/tests_view_status.py|88|
mailcow_integration/tests/tests_view_status.py|95|
mailcow_integration/tests/tests_view_status.py|98|
mailcow_integration/tests/tests_view_status.py|105|
mailcow_integration/tests/tests_view_status.py|107|
mailcow_integration/tests/tests_view_status.py|116|
mailcow_integration/tests/tests_view_status.py|123|
mailcow_integration/tests/tests_view_status.py|126|
mailcow_integration/tests/tests_view_status.py|133|
mailcow_integration/tests/tests_view_status.py|135|
mailcow_integration/tests/tests_view_status.py|144|
mailcow_integration/tests/tests_view_status.py|150 col 1|
mailcow_integration/tests/tests_view_status.py|151|
mailcow_integration/tests/tests_view_status.py|153|
mailcow_integration/tests/tests_view_status.py|155|
mailcow_integration/tests/tests_view_status.py|161|
mailcow_integration/tests/tests_view_status.py|163|
mailcow_integration/tests/tests_view_status.py|167|
mailcow_integration/tests/tests_view_status.py|171|
mailcow_integration/tests/tests_view_status.py|174|
mailcow_integration/tests/tests_view_status.py|180|
mailcow_integration/tests/tests_view_status.py|184|
mailcow_integration/tests/tests_view_status.py|188|
mailcow_integration/tests/tests_view_status.py|191|
mailcow_integration/tests/tests_view_status.py|198|
mailcow_integration/tests/tests_view_status.py|207|
mailcow_integration/tests/tests_view_status.py|214|
mailcow_integration/tests/tests_view_status.py|218|
mailcow_integration/tests/tests_view_status.py|223|
mailcow_integration/tests/tests_view_status.py|230|
mailcow_integration/tests/tests_view_status.py|243|
mailcow_integration/tests/tests_view_status.py|270|
mailcow_integration/tests/tests_view_status.py|279|
mailcow_integration/tests/tests_view_status.py|285|
mailcow_integration/tests/tests_view_status.py|287|
mailcow_integration/tests/tests_view_status.py|291|
mailcow_integration/tests/tests_view_status.py|299|
mailcow_integration/tests/tests_view_status.py|314|
mailcow_integration/tests/tests_view_status.py|325|
mailcow_integration/tests/tests_view_status.py|339|
mailcow_integration/tests/tests_view_status.py|344|
mailcow_integration/tests/tests_view_status.py|348|
mailcow_integration/tests/tests_view_status.py|357|
mailcow_integration/tests/tests_view_status.py|372|
mailcow_integration/tests/tests_view_status.py|376|
mailcow_integration/tests/tests_view_status.py|381|
mailcow_integration/tests/tests_view_status.py|390|
mailcow_integration/tests/tests_view_status.py|400|
mailcow_integration/tests/tests_view_status.py|406|
mailcow_integration/tests/tests_view_status.py|415|
mailcow_integration/tests/tests_view_status.py|420|
mailcow_integration/tests/tests_view_status.py|431|
mailcow_integration/tests/tests_view_status.py|449|
mailcow_integration/tests/tests_view_status.py|464|
mailcow_integration/tests/tests_view_status.py|469|
mailcow_integration/tests/tests_view_status.py|475|
mailcow_integration/tests/tests_view_status.py|477|
mailcow_integration/tests/tests_view_status.py|481|
mailcow_integration/tests/tests_view_status.py|483|
mailcow_integration/tests/tests_view_status.py|487|
mailcow_integration/tests/tests_view_status.py|489|
mailcow_integration/tests/tests_view_status.py|492|
mailcow_integration/tests/tests_view_status.py|501|
mailcow_integration/tests/tests_view_status.py|517|
mailcow_integration/tests/tests_view_status.py|532|
mailcow_integration/tests/tests_view_status.py|547|
mailcow_integration/tests/tests_view_status.py|563|
mailcow_integration/tests/tests_view_status.py|576|
membership_file/models.py|19 col 1|
membership_file/models.py|21|
membership_file/models.py|27|
membership_file/models.py|36 col 1|
membership_file/models.py|44|
membership_file/models.py|152|
membership_file/models.py|260|
membership_file/models.py|264|
membership_file/models.py|271|
membership_file/models.py|275|
membership_file/tests/tests_model.py|13 col 1|
membership_file/tests/tests_model.py|14|
membership_file/tests/tests_model.py|17|
membership_file/tests/tests_model.py|26|
membership_file/tests/tests_model.py|31|
membership_file/tests/tests_model.py|42|
membership_file/tests/tests_model.py|51|
membership_file/tests/tests_model.py|67|
squire/settings.py|243|
squire/settings.py|375|
squire/settings.py|385|
squire/settings_mailcow.py|30|
squire/settings_mailcow.py|33|
squire/settings_mailcow.py|40|
utils/tests/test_views.py|139|
utils/tests/test_views.py|141 col 1|
utils/tests/test_views.py|170 col 1|
utils/tests/test_views.py|171|
utils/tests/test_views.py|181|
utils/tests/test_views.py|185|
utils/tests/test_views.py|191|
utils/tests/test_views.py|197|
utils/viewcollectives.py|57|
utils/viewcollectives.py|61|
utils/viewcollectives.py|65|
utils/viewcollectives.py|71|
utils/viewcollectives.py|77|
utils/viewcollectives.py|101 col 1|
utils/viewcollectives.py|103|
utils/viewcollectives.py|112|
utils/viewcollectives.py|156|
utils/viewcollectives.py|171|
utils/viewcollectives.py|207|
utils/viewcollectives.py|225|
utils/views.py|119|

Comment on lines +185 to +186
subscribers = self._get_subscriberinfos_by_status(status, subscribers, alias, alias_type=AliasCategory.GLOBAL_COMMITTEE)
info = AliasInfos(status.name, subscribers, address, "gc_" + alias_address_to_id(address), address,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
subscribers = self._get_subscriberinfos_by_status(status, subscribers, alias, alias_type=AliasCategory.GLOBAL_COMMITTEE)
info = AliasInfos(status.name, subscribers, address, "gc_" + alias_address_to_id(address), address,
subscribers = self._get_subscriberinfos_by_status(
status, subscribers, alias, alias_type=AliasCategory.GLOBAL_COMMITTEE
)
info = AliasInfos(
status.name,
subscribers,
address,
"gc_" + alias_address_to_id(address),
address,

subscribers = self._get_subscriberinfos_by_status(status, subscribers, alias, alias_type=AliasCategory.GLOBAL_COMMITTEE)
info = AliasInfos(status.name, subscribers, address, "gc_" + alias_address_to_id(address), address,
"Allows mailing all committees at the same time.",
alias or mailbox, internal=False, allow_opt_out=False, archive_addresses=settings.COMMITTEE_CONFIGS['global_archive_addresses']

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
alias or mailbox, internal=False, allow_opt_out=False, archive_addresses=settings.COMMITTEE_CONFIGS['global_archive_addresses']
alias or mailbox,
internal=False,
allow_opt_out=False,
archive_addresses=settings.COMMITTEE_CONFIGS["global_archive_addresses"],

Comment on lines +193 to +194
def _init_committee_alias_list(self, aliases: List[MailcowAlias], mailboxes: List[MailcowMailbox]) -> List[AliasInfos]:
""" Initialize committee aliases. e.g. bg@example.com """

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
def _init_committee_alias_list(self, aliases: List[MailcowAlias], mailboxes: List[MailcowMailbox]) -> List[AliasInfos]:
""" Initialize committee aliases. e.g. bg@example.com """
def _init_committee_alias_list(
self, aliases: List[MailcowAlias], mailboxes: List[MailcowMailbox]
) -> List[AliasInfos]:
"""Initialize committee aliases. e.g. bg@example.com"""


for assoc_group in self.mailcow_manager.get_active_committees():
address = assoc_group.contact_email
subscribers = assoc_group.members.filter_active().order_by('email')

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
subscribers = assoc_group.members.filter_active().order_by('email')
subscribers = assoc_group.members.filter_active().order_by("email")

Comment on lines +201 to +202
status, alias, mailbox = self._get_alias_status(address, subscribers, AliasCategory.COMMITTEE,
aliases, mailboxes, self.mailcow_manager.ALIAS_COMMITTEE_PUBLIC_COMMENT)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
status, alias, mailbox = self._get_alias_status(address, subscribers, AliasCategory.COMMITTEE,
aliases, mailboxes, self.mailcow_manager.ALIAS_COMMITTEE_PUBLIC_COMMENT)
status, alias, mailbox = self._get_alias_status(
address,
subscribers,
AliasCategory.COMMITTEE,
aliases,
mailboxes,
self.mailcow_manager.ALIAS_COMMITTEE_PUBLIC_COMMENT,
)

Comment on lines +26 to +29
In order to connect to a `host`'s API, an `api_key` needs to be generated in the
Mailcow admin. Additionally, the API needs to be activated, and the ipv4 and/or ipv6
addresses of the client needs to be added to an IP whitelist (alternatively, the
IP whitelist can be disabled entirely).

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
In order to connect to a `host`'s API, an `api_key` needs to be generated in the
Mailcow admin. Additionally, the API needs to be activated, and the ipv4 and/or ipv6
addresses of the client needs to be added to an IP whitelist (alternatively, the
IP whitelist can be disabled entirely).
In order to connect to a `host`'s API, an `api_key` needs to be generated in the
Mailcow admin. Additionally, the API needs to be activated, and the ipv4 and/or ipv6
addresses of the client needs to be added to an IP whitelist (alternatively, the
IP whitelist can be disabled entirely).

addresses of the client needs to be added to an IP whitelist (alternatively, the
IP whitelist can be disabled entirely).
"""
API_FORMAT = "%(host)s/api/v1/"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
API_FORMAT = "%(host)s/api/v1/"
API_FORMAT = "%(host)s/api/v1/"

self.api_key = api_key

def _get_headers(self) -> dict:
""" Retrieves the headers required to fetch info from the Mailcow API. """

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
""" Retrieves the headers required to fetch info from the Mailcow API. """
"""Retrieves the headers required to fetch info from the Mailcow API."""

Comment on lines +46 to +47
""" Checks some response data, and generates an appropriate exception based on it """
if content.get('type', None) == "error":

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
""" Checks some response data, and generates an appropriate exception based on it """
if content.get('type', None) == "error":
"""Checks some response data, and generates an appropriate exception based on it"""
if content.get("type", None) == "error":

""" Checks some response data, and generates an appropriate exception based on it """
if content.get('type', None) == "error":
# API returned an error
if content.get('msg', None) == "authentication failed":

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
if content.get('msg', None) == "authentication failed":
if content.get("msg", None) == "authentication failed":

Rspamd setting that makes aliases internal can be viewed on the status page.
"Internal" aliases now indicate they're exposed when this rspamd setting is missing or inactive.
Aliases now indicate if they're inactive.

Added a few more missing tests.
Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remaining comments which cannot be posted as a review comment to avoid GitHub Rate Limit

blackfmt

mailcow_integration/api/exceptions.py|1|
mailcow_integration/api/exceptions.py|3|
mailcow_integration/api/exceptions.py|6|
mailcow_integration/api/exceptions.py|9|
mailcow_integration/api/exceptions.py|12|
mailcow_integration/api/exceptions.py|15|
mailcow_integration/api/exceptions.py|18|
mailcow_integration/api/interface/alias.py|9 col 1|
mailcow_integration/api/interface/alias.py|18|
mailcow_integration/api/interface/alias.py|24|
mailcow_integration/api/interface/alias.py|33|
mailcow_integration/api/interface/alias.py|55|
mailcow_integration/api/interface/base.py|3 col 1|
mailcow_integration/api/interface/base.py|4|
mailcow_integration/api/interface/base.py|8|
mailcow_integration/api/interface/mailbox.py|8 col 1|
mailcow_integration/api/interface/mailbox.py|9|
mailcow_integration/api/interface/mailbox.py|14 col 1|
mailcow_integration/api/interface/mailbox.py|15|
mailcow_integration/api/interface/mailbox.py|21 col 1|
mailcow_integration/api/interface/mailbox.py|22|
mailcow_integration/api/interface/mailbox.py|29|
mailcow_integration/api/interface/mailbox.py|39|
mailcow_integration/api/interface/mailbox.py|44|
mailcow_integration/api/interface/mailbox.py|63|
mailcow_integration/api/interface/mailbox.py|70|
mailcow_integration/api/interface/mailbox.py|72|
mailcow_integration/api/interface/mailbox.py|78|
mailcow_integration/api/interface/mailbox.py|87|
mailcow_integration/api/interface/mailbox.py|89|
mailcow_integration/api/interface/mailbox.py|98|
mailcow_integration/api/interface/mailbox.py|107|
mailcow_integration/api/interface/rspamd.py|6 col 1|
mailcow_integration/api/interface/rspamd.py|8|
mailcow_integration/api/interface/rspamd.py|11|
mailcow_integration/api/interface/rspamd.py|15|
mailcow_integration/apps.py|8 col 1|
mailcow_integration/apps.py|10 col 1|
mailcow_integration/apps.py|11|
mailcow_integration/apps.py|22|
mailcow_integration/apps.py|29|
mailcow_integration/dynamic_preferences_registry.py|10|
mailcow_integration/dynamic_preferences_registry.py|16|
mailcow_integration/dynamic_preferences_registry.py|18|
mailcow_integration/dynamic_preferences_registry.py|21 col 1|
mailcow_integration/dynamic_preferences_registry.py|22|
mailcow_integration/dynamic_preferences_registry.py|25 col 1|
mailcow_integration/dynamic_preferences_registry.py|26|
mailcow_integration/dynamic_preferences_registry.py|31|
mailcow_integration/dynamic_preferences_registry.py|33|
mailcow_integration/dynamic_preferences_registry.py|37|
mailcow_integration/dynamic_preferences_registry.py|41|
mailcow_integration/dynamic_preferences_registry.py|46|
mailcow_integration/dynamic_preferences_registry.py|52|
mailcow_integration/dynamic_preferences_registry.py|58|
mailcow_integration/dynamic_preferences_registry.py|61 col 1|
mailcow_integration/management/commands/mailcow_api_request.py|6|
mailcow_integration/management/commands/mailcow_api_request.py|10|
mailcow_integration/management/commands/mailcow_api_request.py|16|
mailcow_integration/signals.py|11|
mailcow_integration/signals.py|16|
mailcow_integration/signals.py|20 col 1|
mailcow_integration/signals.py|21|
mailcow_integration/signals.py|30 col 1|
mailcow_integration/signals.py|38 col 1|
mailcow_integration/signals.py|45 col 1|
mailcow_integration/signals.py|50|
mailcow_integration/signals.py|68 col 1|
mailcow_integration/signals.py|70|
mailcow_integration/signals.py|76|
mailcow_integration/signals.py|92 col 1|
mailcow_integration/signals.py|94|
mailcow_integration/signals.py|112|
mailcow_integration/signals.py|132 col 1|
mailcow_integration/signals.py|134|
mailcow_integration/signals.py|167|
mailcow_integration/signals.py|177 col 1|
mailcow_integration/signals.py|179|
mailcow_integration/signals.py|181|
mailcow_integration/signals.py|189 col 1|
mailcow_integration/signals.py|194|
mailcow_integration/signals.py|213 col 1|
mailcow_integration/signals.py|215|
mailcow_integration/signals.py|226|
mailcow_integration/signals.py|231|
mailcow_integration/signals.py|242 col 1|
mailcow_integration/signals.py|244|
mailcow_integration/signals.py|257|
mailcow_integration/signals.py|275 col 1|
mailcow_integration/signals.py|277|
mailcow_integration/signals.py|284|
mailcow_integration/signals.py|299 col 1|
mailcow_integration/signals.py|301|
mailcow_integration/signals.py|309 col 1|
mailcow_integration/signals.py|314|
mailcow_integration/signals.py|332 col 1|
mailcow_integration/signals.py|334|
mailcow_integration/signals.py|345|
mailcow_integration/signals.py|362 col 1|
mailcow_integration/signals.py|364|
mailcow_integration/signals.py|371 col 1|
mailcow_integration/signals.py|373|
mailcow_integration/signals.py|383 col 1|
mailcow_integration/signals.py|392|
mailcow_integration/signals.py|397|
mailcow_integration/signals.py|399|
mailcow_integration/signals.py|407|
mailcow_integration/squire_mailcow.py|21|
mailcow_integration/squire_mailcow.py|25 col 1|
mailcow_integration/squire_mailcow.py|26|
mailcow_integration/squire_mailcow.py|32|
mailcow_integration/squire_mailcow.py|37|
mailcow_integration/squire_mailcow.py|48 col 1|
mailcow_integration/squire_mailcow.py|64|
mailcow_integration/squire_mailcow.py|86|
mailcow_integration/squire_mailcow.py|92|
mailcow_integration/squire_mailcow.py|100|
mailcow_integration/squire_mailcow.py|106|
mailcow_integration/squire_mailcow.py|124|
mailcow_integration/squire_mailcow.py|134|
mailcow_integration/squire_mailcow.py|138|
mailcow_integration/squire_mailcow.py|163|
mailcow_integration/squire_mailcow.py|178|
mailcow_integration/squire_mailcow.py|186|
mailcow_integration/squire_mailcow.py|195|
mailcow_integration/squire_mailcow.py|199|
mailcow_integration/squire_mailcow.py|204|
mailcow_integration/squire_mailcow.py|208|
mailcow_integration/squire_mailcow.py|211|
mailcow_integration/squire_mailcow.py|228|
mailcow_integration/squire_mailcow.py|240|
mailcow_integration/squire_mailcow.py|247|
mailcow_integration/squire_mailcow.py|262|
mailcow_integration/squire_mailcow.py|265|
mailcow_integration/squire_mailcow.py|275|
mailcow_integration/squire_mailcow.py|290|
mailcow_integration/squire_mailcow.py|298|
mailcow_integration/squire_mailcow.py|311|
mailcow_integration/squire_mailcow.py|319|
mailcow_integration/squire_mailcow.py|323|
mailcow_integration/squire_mailcow.py|326|
mailcow_integration/squire_mailcow.py|336|
mailcow_integration/squire_mailcow.py|341|
mailcow_integration/squire_mailcow.py|343|
mailcow_integration/squire_mailcow.py|347|
mailcow_integration/tests/api/test_interfaces.py|6|
mailcow_integration/tests/api/test_interfaces.py|11|
mailcow_integration/tests/api/test_interfaces.py|30|
mailcow_integration/tests/api/test_interfaces.py|71|
mailcow_integration/tests/api/test_interfaces.py|81|
mailcow_integration/tests/api/test_interfaces.py|83|
mailcow_integration/tests/api/test_interfaces.py|90|
mailcow_integration/tests/api/test_interfaces.py|92|
mailcow_integration/tests/api/test_interfaces.py|100|
mailcow_integration/tests/api/test_interfaces.py|128|
mailcow_integration/tests/api/test_interfaces.py|133|
mailcow_integration/tests/api/tests_mailcow_client.py|23 col 1|
mailcow_integration/tests/api/tests_mailcow_client.py|24|
mailcow_integration/tests/api/tests_mailcow_client.py|31|
mailcow_integration/tests/api/tests_mailcow_client.py|34|
mailcow_integration/tests/api/tests_mailcow_client.py|38|
mailcow_integration/tests/api/tests_mailcow_client.py|46|
mailcow_integration/tests/api/tests_mailcow_client.py|48|
mailcow_integration/tests/api/tests_mailcow_client.py|50|
mailcow_integration/tests/api/tests_mailcow_client.py|55|
mailcow_integration/tests/api/tests_mailcow_client.py|62|
mailcow_integration/tests/api/tests_mailcow_client.py|66|
mailcow_integration/tests/api/tests_mailcow_client.py|75|
mailcow_integration/tests/api/tests_mailcow_client.py|80|
mailcow_integration/tests/api/tests_mailcow_client.py|87|
mailcow_integration/tests/api/tests_mailcow_client.py|89|
mailcow_integration/tests/api/tests_mailcow_client.py|91|
mailcow_integration/tests/api/tests_mailcow_client.py|93|
mailcow_integration/tests/api/tests_mailcow_client.py|96|
mailcow_integration/tests/api/tests_mailcow_client.py|100|
mailcow_integration/tests/api/tests_mailcow_client.py|107|
mailcow_integration/tests/api/tests_mailcow_client.py|114|
mailcow_integration/tests/api/tests_mailcow_client.py|121|
mailcow_integration/tests/api/tests_mailcow_client.py|128|
mailcow_integration/tests/api/tests_mailcow_client.py|135|
mailcow_integration/tests/api/tests_mailcow_client.py|142|
mailcow_integration/tests/api/tests_mailcow_client.py|152|
mailcow_integration/tests/api/tests_mailcow_client.py|157|
mailcow_integration/tests/api/tests_mailcow_client.py|168|
mailcow_integration/tests/api/tests_mailcow_client.py|172|
mailcow_integration/tests/api/tests_mailcow_client.py|182|
mailcow_integration/tests/api/tests_mailcow_client.py|187|
mailcow_integration/tests/api/tests_mailcow_client.py|199|
mailcow_integration/tests/api/tests_mailcow_client.py|212|
mailcow_integration/tests/api/tests_mailcow_client.py|221|
mailcow_integration/tests/api/tests_mailcow_client.py|234|
mailcow_integration/tests/api/tests_mailcow_client.py|240|
mailcow_integration/tests/api/tests_mailcow_client.py|242|
mailcow_integration/tests/api/tests_mailcow_client.py|247|
mailcow_integration/tests/api/tests_mailcow_client.py|253|
mailcow_integration/tests/api/tests_mailcow_client.py|255|
mailcow_integration/tests/api/tests_mailcow_client.py|260|
mailcow_integration/tests/api/tests_mailcow_client.py|265|
mailcow_integration/tests/api/tests_mailcow_client.py|277|
mailcow_integration/tests/api/tests_mailcow_client.py|287|
mailcow_integration/tests/api/tests_mailcow_client.py|296|
mailcow_integration/tests/api/tests_mailcow_client.py|306|
mailcow_integration/tests/api/tests_mailcow_client.py|312|
mailcow_integration/tests/api/tests_mailcow_client.py|314|
mailcow_integration/tests/api/tests_mailcow_client.py|319|
mailcow_integration/tests/api/tests_mailcow_client.py|325|
mailcow_integration/tests/api/tests_mailcow_client.py|327|
mailcow_integration/tests/api/tests_mailcow_client.py|332|
mailcow_integration/tests/api/tests_mailcow_client.py|339|
mailcow_integration/tests/api/tests_mailcow_client.py|356|
mailcow_integration/tests/api/tests_mailcow_client.py|361|
mailcow_integration/tests/api/tests_mailcow_client.py|372|
mailcow_integration/tests/api/tests_mailcow_client.py|376|
mailcow_integration/tests/api/tests_mailcow_client.py|381|
mailcow_integration/tests/api/tests_mailcow_client.py|393|
mailcow_integration/tests/api/tests_mailcow_client.py|397|
mailcow_integration/tests/api/tests_mailcow_client.py|407|
mailcow_integration/tests/api/tests_mailcow_client.py|410|
mailcow_integration/tests/api/tests_mailcow_client.py|422|
mailcow_integration/tests/api/tests_mailcow_client.py|432|
mailcow_integration/tests/api/tests_mailcow_client.py|435|
mailcow_integration/tests/api/tests_mailcow_client.py|447|
mailcow_integration/tests/tests_member_preferences.py|13|
mailcow_integration/tests/tests_member_preferences.py|24|
mailcow_integration/tests/tests_member_preferences.py|27|
mailcow_integration/tests/tests_member_preferences.py|35|
mailcow_integration/tests/tests_member_preferences.py|38|
mailcow_integration/tests/tests_member_preferences.py|44|
mailcow_integration/tests/tests_member_preferences.py|46|
mailcow_integration/tests/tests_member_preferences.py|48|
mailcow_integration/tests/tests_member_preferences.py|56|
mailcow_integration/tests/tests_member_preferences.py|58|
mailcow_integration/tests/tests_member_preferences.py|60|
mailcow_integration/tests/tests_preferences.py|13 col 1|
mailcow_integration/tests/tests_preferences.py|14|
mailcow_integration/tests/tests_preferences.py|16|
mailcow_integration/tests/tests_preferences.py|23|
mailcow_integration/tests/tests_preferences.py|27|
mailcow_integration/tests/tests_preferences.py|31|
mailcow_integration/tests/tests_signals.py|12 col 1|
mailcow_integration/tests/tests_signals.py|13|
mailcow_integration/tests/tests_signals.py|31 col 1|
mailcow_integration/tests/tests_signals.py|34 col 1|
mailcow_integration/tests/tests_signals.py|46|
mailcow_integration/tests/tests_signals.py|53|
mailcow_integration/tests/tests_signals.py|66|
mailcow_integration/tests/tests_signals.py|70|
mailcow_integration/tests/tests_signals.py|77|
mailcow_integration/tests/tests_signals.py|79|
mailcow_integration/tests/tests_signals.py|81|
mailcow_integration/tests/tests_signals.py|86|
mailcow_integration/tests/tests_signals.py|91|
mailcow_integration/tests/tests_signals.py|111|
mailcow_integration/tests/tests_signals.py|113|
mailcow_integration/tests/tests_signals.py|120|
mailcow_integration/tests/tests_signals.py|127|
mailcow_integration/tests/tests_signals.py|134|
mailcow_integration/tests/tests_signals.py|136|
mailcow_integration/tests/tests_signals.py|150|
mailcow_integration/tests/tests_signals.py|157|
mailcow_integration/tests/tests_signals.py|224|
mailcow_integration/tests/tests_signals.py|226|
mailcow_integration/tests/tests_signals.py|244|
mailcow_integration/tests/tests_signals.py|251|
mailcow_integration/tests/tests_signals.py|258|
mailcow_integration/tests/tests_signals.py|260|
mailcow_integration/tests/tests_signals.py|264|
mailcow_integration/tests/tests_signals.py|289|
mailcow_integration/tests/tests_signals.py|322|
mailcow_integration/tests/tests_signals.py|324|
mailcow_integration/tests/tests_signals.py|331|
mailcow_integration/tests/tests_signals.py|338|
mailcow_integration/tests/tests_signals.py|345|
mailcow_integration/tests/tests_signals.py|347|
mailcow_integration/tests/tests_signals.py|365|
mailcow_integration/tests/tests_signals.py|383|
mailcow_integration/tests/tests_signals.py|398|
mailcow_integration/tests/tests_signals.py|405|
mailcow_integration/tests/tests_signals.py|407|
mailcow_integration/tests/tests_signals.py|410|
mailcow_integration/tests/tests_signals.py|436|
mailcow_integration/tests/tests_signals.py|440|
mailcow_integration/tests/tests_signals.py|487|
mailcow_integration/tests/tests_signals.py|490|
mailcow_integration/tests/tests_squire_mailcow.py|26|
mailcow_integration/tests/tests_squire_mailcow.py|32|
mailcow_integration/tests/tests_squire_mailcow.py|39|
mailcow_integration/tests/tests_squire_mailcow.py|45|
mailcow_integration/tests/tests_squire_mailcow.py|47|
mailcow_integration/tests/tests_squire_mailcow.py|53|
mailcow_integration/tests/tests_squire_mailcow.py|59|
mailcow_integration/tests/tests_squire_mailcow.py|63|
mailcow_integration/tests/tests_squire_mailcow.py|69|
mailcow_integration/tests/tests_squire_mailcow.py|73|
mailcow_integration/tests/tests_squire_mailcow.py|77|
mailcow_integration/tests/tests_squire_mailcow.py|81|
mailcow_integration/tests/tests_squire_mailcow.py|103|
mailcow_integration/tests/tests_squire_mailcow.py|107|
mailcow_integration/tests/tests_squire_mailcow.py|112|
mailcow_integration/tests/tests_squire_mailcow.py|134|
mailcow_integration/tests/tests_squire_mailcow.py|142|
mailcow_integration/tests/tests_squire_mailcow.py|150|
mailcow_integration/tests/tests_squire_mailcow.py|153|
mailcow_integration/tests/tests_squire_mailcow.py|156|
mailcow_integration/tests/tests_squire_mailcow.py|162|
mailcow_integration/tests/tests_squire_mailcow.py|173|
mailcow_integration/tests/tests_squire_mailcow.py|186|
mailcow_integration/tests/tests_squire_mailcow.py|193|
mailcow_integration/tests/tests_squire_mailcow.py|197|
mailcow_integration/tests/tests_squire_mailcow.py|207|
mailcow_integration/tests/tests_squire_mailcow.py|212|
mailcow_integration/tests/tests_squire_mailcow.py|228|
mailcow_integration/tests/tests_squire_mailcow.py|238|
mailcow_integration/tests/tests_squire_mailcow.py|243|
mailcow_integration/tests/tests_squire_mailcow.py|250|
mailcow_integration/tests/tests_squire_mailcow.py|259|
mailcow_integration/tests/tests_squire_mailcow.py|269|
mailcow_integration/tests/tests_squire_mailcow.py|274|
mailcow_integration/tests/tests_squire_mailcow.py|289|
mailcow_integration/tests/tests_squire_mailcow.py|298|
mailcow_integration/tests/tests_squire_mailcow.py|303|
mailcow_integration/tests/tests_squire_mailcow.py|318|
mailcow_integration/tests/tests_squire_mailcow.py|330|
mailcow_integration/tests/tests_squire_mailcow.py|335|
mailcow_integration/tests/tests_squire_mailcow.py|351|
mailcow_integration/tests/tests_squire_mailcow.py|358|
mailcow_integration/tests/tests_squire_mailcow.py|383|
mailcow_integration/tests/tests_squire_mailcow.py|395|
mailcow_integration/tests/tests_squire_mailcow.py|398|
mailcow_integration/tests/tests_squire_mailcow.py|400|
mailcow_integration/tests/tests_squire_mailcow.py|404|
mailcow_integration/tests/tests_squire_mailcow.py|413|
mailcow_integration/tests/tests_squire_mailcow.py|419|
mailcow_integration/tests/tests_squire_mailcow.py|438|
mailcow_integration/tests/tests_squire_mailcow.py|451|
mailcow_integration/tests/tests_squire_mailcow.py|475|
mailcow_integration/tests/tests_squire_mailcow.py|478|
mailcow_integration/tests/tests_squire_mailcow.py|481|
mailcow_integration/tests/tests_squire_mailcow.py|484|
mailcow_integration/tests/tests_squire_mailcow.py|491|
mailcow_integration/tests/tests_squire_mailcow.py|499|
mailcow_integration/tests/tests_squire_mailcow.py|508|
mailcow_integration/tests/tests_squire_mailcow.py|512|
mailcow_integration/tests/tests_squire_mailcow.py|514|
mailcow_integration/tests/tests_squire_mailcow.py|517|
mailcow_integration/tests/tests_squire_mailcow.py|526|
mailcow_integration/tests/tests_squire_mailcow.py|528|
mailcow_integration/tests/tests_squire_mailcow.py|531|
mailcow_integration/tests/tests_squire_mailcow.py|546|
mailcow_integration/tests/tests_squire_mailcow.py|551|
mailcow_integration/tests/tests_squire_mailcow.py|555|
mailcow_integration/tests/tests_squire_mailcow.py|558|
mailcow_integration/tests/tests_view_status.py|11|
mailcow_integration/tests/tests_view_status.py|25 col 1|
mailcow_integration/tests/tests_view_status.py|26|
mailcow_integration/tests/tests_view_status.py|28|
mailcow_integration/tests/tests_view_status.py|33 col 1|
mailcow_integration/tests/tests_view_status.py|34|
mailcow_integration/tests/tests_view_status.py|46|
mailcow_integration/tests/tests_view_status.py|51|
mailcow_integration/tests/tests_view_status.py|53|
mailcow_integration/tests/tests_view_status.py|59|
mailcow_integration/tests/tests_view_status.py|64|
mailcow_integration/tests/tests_view_status.py|66|
mailcow_integration/tests/tests_view_status.py|70|
mailcow_integration/tests/tests_view_status.py|77|
mailcow_integration/tests/tests_view_status.py|79|
mailcow_integration/tests/tests_view_status.py|85|
mailcow_integration/tests/tests_view_status.py|88|
mailcow_integration/tests/tests_view_status.py|95|
mailcow_integration/tests/tests_view_status.py|98|
mailcow_integration/tests/tests_view_status.py|105|
mailcow_integration/tests/tests_view_status.py|107|
mailcow_integration/tests/tests_view_status.py|116|
mailcow_integration/tests/tests_view_status.py|123|
mailcow_integration/tests/tests_view_status.py|126|
mailcow_integration/tests/tests_view_status.py|133|
mailcow_integration/tests/tests_view_status.py|135|
mailcow_integration/tests/tests_view_status.py|144|
mailcow_integration/tests/tests_view_status.py|150 col 1|
mailcow_integration/tests/tests_view_status.py|151|
mailcow_integration/tests/tests_view_status.py|153|
mailcow_integration/tests/tests_view_status.py|155|
mailcow_integration/tests/tests_view_status.py|161|
mailcow_integration/tests/tests_view_status.py|163|
mailcow_integration/tests/tests_view_status.py|167|
mailcow_integration/tests/tests_view_status.py|171|
mailcow_integration/tests/tests_view_status.py|174|
mailcow_integration/tests/tests_view_status.py|180|
mailcow_integration/tests/tests_view_status.py|184|
mailcow_integration/tests/tests_view_status.py|188|
mailcow_integration/tests/tests_view_status.py|191|
mailcow_integration/tests/tests_view_status.py|198|
mailcow_integration/tests/tests_view_status.py|207|
mailcow_integration/tests/tests_view_status.py|214|
mailcow_integration/tests/tests_view_status.py|218|
mailcow_integration/tests/tests_view_status.py|223|
mailcow_integration/tests/tests_view_status.py|230|
mailcow_integration/tests/tests_view_status.py|243|
mailcow_integration/tests/tests_view_status.py|270|
mailcow_integration/tests/tests_view_status.py|279|
mailcow_integration/tests/tests_view_status.py|285|
mailcow_integration/tests/tests_view_status.py|287|
mailcow_integration/tests/tests_view_status.py|291|
mailcow_integration/tests/tests_view_status.py|299|
mailcow_integration/tests/tests_view_status.py|314|
mailcow_integration/tests/tests_view_status.py|325|
mailcow_integration/tests/tests_view_status.py|339|
mailcow_integration/tests/tests_view_status.py|344|
mailcow_integration/tests/tests_view_status.py|348|
mailcow_integration/tests/tests_view_status.py|357|
mailcow_integration/tests/tests_view_status.py|372|
mailcow_integration/tests/tests_view_status.py|376|
mailcow_integration/tests/tests_view_status.py|381|
mailcow_integration/tests/tests_view_status.py|390|
mailcow_integration/tests/tests_view_status.py|400|
mailcow_integration/tests/tests_view_status.py|406|
mailcow_integration/tests/tests_view_status.py|415|
mailcow_integration/tests/tests_view_status.py|420|
mailcow_integration/tests/tests_view_status.py|431|
mailcow_integration/tests/tests_view_status.py|449|
mailcow_integration/tests/tests_view_status.py|464|
mailcow_integration/tests/tests_view_status.py|469|
mailcow_integration/tests/tests_view_status.py|475|
mailcow_integration/tests/tests_view_status.py|477|
mailcow_integration/tests/tests_view_status.py|481|
mailcow_integration/tests/tests_view_status.py|483|
mailcow_integration/tests/tests_view_status.py|487|
mailcow_integration/tests/tests_view_status.py|489|
mailcow_integration/tests/tests_view_status.py|492|
mailcow_integration/tests/tests_view_status.py|501|
mailcow_integration/tests/tests_view_status.py|517|
mailcow_integration/tests/tests_view_status.py|532|
mailcow_integration/tests/tests_view_status.py|547|
mailcow_integration/tests/tests_view_status.py|563|
mailcow_integration/tests/tests_view_status.py|576|
membership_file/models.py|19 col 1|
membership_file/models.py|21|
membership_file/models.py|27|
membership_file/models.py|36 col 1|
membership_file/models.py|44|
membership_file/models.py|152|
membership_file/models.py|260|
membership_file/models.py|264|
membership_file/models.py|271|
membership_file/models.py|275|
membership_file/tests/tests_model.py|13 col 1|
membership_file/tests/tests_model.py|14|
membership_file/tests/tests_model.py|17|
membership_file/tests/tests_model.py|27|
membership_file/tests/tests_model.py|32|
membership_file/tests/tests_model.py|44|
membership_file/tests/tests_model.py|54|
membership_file/tests/tests_model.py|70|
membership_file/tests/tests_model.py|112|
squire/settings.py|243|
squire/settings.py|375|
squire/settings.py|385|
squire/settings_mailcow.py|30|
squire/settings_mailcow.py|33|
squire/settings_mailcow.py|40|
utils/tests/test_views.py|139|
utils/tests/test_views.py|141 col 1|
utils/tests/test_views.py|170 col 1|
utils/tests/test_views.py|171|
utils/tests/test_views.py|181|
utils/tests/test_views.py|185|
utils/tests/test_views.py|191|
utils/tests/test_views.py|197|
utils/viewcollectives.py|57|
utils/viewcollectives.py|61|
utils/viewcollectives.py|65|
utils/viewcollectives.py|71|
utils/viewcollectives.py|77|
utils/viewcollectives.py|101 col 1|
utils/viewcollectives.py|103|
utils/viewcollectives.py|112|
utils/viewcollectives.py|156|
utils/viewcollectives.py|171|
utils/viewcollectives.py|207|
utils/viewcollectives.py|225|
utils/views.py|119|

subscribers = self._get_subscriberinfos_by_status(status, subscribers, alias, alias_type=AliasCategory.GLOBAL_COMMITTEE)
info = AliasInfos(status.name, subscribers, address, "gc_" + alias_address_to_id(address), address,
"Allows mailing all committees at the same time.",
alias or mailbox, internal=True, exposure_routes=exp_routes, allow_opt_out=None, archive_addresses=settings.COMMITTEE_CONFIGS['global_archive_addresses']

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
alias or mailbox, internal=True, exposure_routes=exp_routes, allow_opt_out=None, archive_addresses=settings.COMMITTEE_CONFIGS['global_archive_addresses']
alias or mailbox,
internal=True,
exposure_routes=exp_routes,
allow_opt_out=None,
archive_addresses=settings.COMMITTEE_CONFIGS["global_archive_addresses"],

Comment on lines 266 to 267
context['internal_alias_rspamd_setting'] = self.mailcow_manager.internal_alias_rspamd_setting
context['mailcow_host'] = self.mailcow_manager.mailcow_host

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
context['internal_alias_rspamd_setting'] = self.mailcow_manager.internal_alias_rspamd_setting
context['mailcow_host'] = self.mailcow_manager.mailcow_host
context["internal_alias_rspamd_setting"] = self.mailcow_manager.internal_alias_rspamd_setting
context["mailcow_host"] = self.mailcow_manager.mailcow_host

raise MailcowAuthException(f"{request_url}: {content['msg']}")
elif content.get("msg", "").startswith("API read/write access denied"):
raise MailcowAPIReadWriteAccessDenied(f"{request_url}: {content['msg']}")
elif content.get('msg', "").startswith("api access denied"):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
elif content.get('msg', "").startswith("api access denied"):
elif content.get("msg", "").startswith("api access denied"):

elif content.get('msg', "").startswith("api access denied"):
# IP is not whitelisted
raise MailcowAPIAccessDenied(f"{request_url}: {content['msg']}")
elif content.get('msg', None) == "route not found":

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
elif content.get('msg', None) == "route not found":
elif content.get("msg", None) == "route not found":

# Some other error (should not happen)
logger.error(content)
raise MailcowException(f"{request_url}: {content['msg']}")
elif content.get('type', None) == 'danger':

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
elif content.get('type', None) == 'danger':
elif content.get("type", None) == "danger":

return RspamdSettings.from_json(content)

def update_rspamd_setting(self, setting: RspamdSettings) -> dict:
""" Updates the RspamdSetting associated to the given ID with the given data """

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
""" Updates the RspamdSetting associated to the given ID with the given data """
"""Updates the RspamdSetting associated to the given ID with the given data"""

Comment on lines +195 to +200
data = json.dumps({
'items': [setting.id],
'attr': {
'active': int(setting.active),
'desc': setting.desc,
'content': setting.content,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
data = json.dumps({
'items': [setting.id],
'attr': {
'active': int(setting.active),
'desc': setting.desc,
'content': setting.content,
data = json.dumps(
{
"items": [setting.id],
"attr": {
"active": int(setting.active),
"desc": setting.desc,
"content": setting.content,
},

'desc': setting.desc,
'content': setting.content,
}
})

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
})
)

return self._make_request(f"edit/rsetting", request_type=RequestType.POST, data=data)

def create_rspamd_setting(self, setting: RspamdSettings) -> dict:
""" Creates a new Rspamd setting """

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
""" Creates a new Rspamd setting """
"""Creates a new Rspamd setting"""

Comment on lines +209 to +213
data = json.dumps({
'desc': setting.desc,
'content': setting.content,
'active': int(setting.active),
})

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
data = json.dumps({
'desc': setting.desc,
'content': setting.content,
'active': int(setting.active),
})
data = json.dumps(
{
"desc": setting.desc,
"content": setting.content,
"active": int(setting.active),
}
)

Turned MailcowManager.internal_alias_rspamd_setting back into a method due to the extra cache-control parameter.
SquireMailcowManager.is_internal_alias
Member.is_active
Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remaining comments which cannot be posted as a review comment to avoid GitHub Rate Limit

blackfmt

mailcow_integration/api/interface/mailbox.py|89|
mailcow_integration/api/interface/mailbox.py|98|
mailcow_integration/api/interface/mailbox.py|107|
mailcow_integration/api/interface/rspamd.py|6 col 1|
mailcow_integration/api/interface/rspamd.py|8|
mailcow_integration/api/interface/rspamd.py|11|
mailcow_integration/api/interface/rspamd.py|15|
mailcow_integration/apps.py|8 col 1|
mailcow_integration/apps.py|10 col 1|
mailcow_integration/apps.py|11|
mailcow_integration/apps.py|22|
mailcow_integration/apps.py|29|
mailcow_integration/dynamic_preferences_registry.py|10|
mailcow_integration/dynamic_preferences_registry.py|16|
mailcow_integration/dynamic_preferences_registry.py|18|
mailcow_integration/dynamic_preferences_registry.py|21 col 1|
mailcow_integration/dynamic_preferences_registry.py|22|
mailcow_integration/dynamic_preferences_registry.py|25 col 1|
mailcow_integration/dynamic_preferences_registry.py|26|
mailcow_integration/dynamic_preferences_registry.py|31|
mailcow_integration/dynamic_preferences_registry.py|33|
mailcow_integration/dynamic_preferences_registry.py|37|
mailcow_integration/dynamic_preferences_registry.py|41|
mailcow_integration/dynamic_preferences_registry.py|46|
mailcow_integration/dynamic_preferences_registry.py|52|
mailcow_integration/dynamic_preferences_registry.py|58|
mailcow_integration/dynamic_preferences_registry.py|61 col 1|
mailcow_integration/management/commands/mailcow_api_request.py|6|
mailcow_integration/management/commands/mailcow_api_request.py|10|
mailcow_integration/management/commands/mailcow_api_request.py|16|
mailcow_integration/signals.py|11|
mailcow_integration/signals.py|16|
mailcow_integration/signals.py|20 col 1|
mailcow_integration/signals.py|21|
mailcow_integration/signals.py|30 col 1|
mailcow_integration/signals.py|38 col 1|
mailcow_integration/signals.py|45 col 1|
mailcow_integration/signals.py|50|
mailcow_integration/signals.py|68 col 1|
mailcow_integration/signals.py|70|
mailcow_integration/signals.py|76|
mailcow_integration/signals.py|92 col 1|
mailcow_integration/signals.py|94|
mailcow_integration/signals.py|112|
mailcow_integration/signals.py|132 col 1|
mailcow_integration/signals.py|134|
mailcow_integration/signals.py|167|
mailcow_integration/signals.py|177 col 1|
mailcow_integration/signals.py|179|
mailcow_integration/signals.py|181|
mailcow_integration/signals.py|189 col 1|
mailcow_integration/signals.py|194|
mailcow_integration/signals.py|213 col 1|
mailcow_integration/signals.py|215|
mailcow_integration/signals.py|226|
mailcow_integration/signals.py|231|
mailcow_integration/signals.py|242 col 1|
mailcow_integration/signals.py|244|
mailcow_integration/signals.py|257|
mailcow_integration/signals.py|275 col 1|
mailcow_integration/signals.py|277|
mailcow_integration/signals.py|284|
mailcow_integration/signals.py|299 col 1|
mailcow_integration/signals.py|301|
mailcow_integration/signals.py|309 col 1|
mailcow_integration/signals.py|314|
mailcow_integration/signals.py|332 col 1|
mailcow_integration/signals.py|334|
mailcow_integration/signals.py|345|
mailcow_integration/signals.py|362 col 1|
mailcow_integration/signals.py|364|
mailcow_integration/signals.py|371 col 1|
mailcow_integration/signals.py|373|
mailcow_integration/signals.py|383 col 1|
mailcow_integration/signals.py|392|
mailcow_integration/signals.py|397|
mailcow_integration/signals.py|399|
mailcow_integration/signals.py|407|
mailcow_integration/squire_mailcow.py|21|
mailcow_integration/squire_mailcow.py|25 col 1|
mailcow_integration/squire_mailcow.py|26|
mailcow_integration/squire_mailcow.py|32|
mailcow_integration/squire_mailcow.py|37|
mailcow_integration/squire_mailcow.py|48 col 1|
mailcow_integration/squire_mailcow.py|64|
mailcow_integration/squire_mailcow.py|86|
mailcow_integration/squire_mailcow.py|92|
mailcow_integration/squire_mailcow.py|100|
mailcow_integration/squire_mailcow.py|105|
mailcow_integration/squire_mailcow.py|123|
mailcow_integration/squire_mailcow.py|133|
mailcow_integration/squire_mailcow.py|137|
mailcow_integration/squire_mailcow.py|162|
mailcow_integration/squire_mailcow.py|177|
mailcow_integration/squire_mailcow.py|185|
mailcow_integration/squire_mailcow.py|194|
mailcow_integration/squire_mailcow.py|198|
mailcow_integration/squire_mailcow.py|203|
mailcow_integration/squire_mailcow.py|207|
mailcow_integration/squire_mailcow.py|210|
mailcow_integration/squire_mailcow.py|227|
mailcow_integration/squire_mailcow.py|239|
mailcow_integration/squire_mailcow.py|246|
mailcow_integration/squire_mailcow.py|261|
mailcow_integration/squire_mailcow.py|264|
mailcow_integration/squire_mailcow.py|274|
mailcow_integration/squire_mailcow.py|289|
mailcow_integration/squire_mailcow.py|297|
mailcow_integration/squire_mailcow.py|310|
mailcow_integration/squire_mailcow.py|318|
mailcow_integration/squire_mailcow.py|322|
mailcow_integration/squire_mailcow.py|325|
mailcow_integration/squire_mailcow.py|335|
mailcow_integration/squire_mailcow.py|340|
mailcow_integration/squire_mailcow.py|342|
mailcow_integration/squire_mailcow.py|346|
mailcow_integration/tests/api/test_interfaces.py|6|
mailcow_integration/tests/api/test_interfaces.py|11|
mailcow_integration/tests/api/test_interfaces.py|30|
mailcow_integration/tests/api/test_interfaces.py|71|
mailcow_integration/tests/api/test_interfaces.py|81|
mailcow_integration/tests/api/test_interfaces.py|83|
mailcow_integration/tests/api/test_interfaces.py|90|
mailcow_integration/tests/api/test_interfaces.py|92|
mailcow_integration/tests/api/test_interfaces.py|100|
mailcow_integration/tests/api/test_interfaces.py|128|
mailcow_integration/tests/api/test_interfaces.py|133|
mailcow_integration/tests/api/tests_mailcow_client.py|23 col 1|
mailcow_integration/tests/api/tests_mailcow_client.py|24|
mailcow_integration/tests/api/tests_mailcow_client.py|31|
mailcow_integration/tests/api/tests_mailcow_client.py|34|
mailcow_integration/tests/api/tests_mailcow_client.py|38|
mailcow_integration/tests/api/tests_mailcow_client.py|46|
mailcow_integration/tests/api/tests_mailcow_client.py|48|
mailcow_integration/tests/api/tests_mailcow_client.py|50|
mailcow_integration/tests/api/tests_mailcow_client.py|55|
mailcow_integration/tests/api/tests_mailcow_client.py|62|
mailcow_integration/tests/api/tests_mailcow_client.py|66|
mailcow_integration/tests/api/tests_mailcow_client.py|75|
mailcow_integration/tests/api/tests_mailcow_client.py|80|
mailcow_integration/tests/api/tests_mailcow_client.py|87|
mailcow_integration/tests/api/tests_mailcow_client.py|89|
mailcow_integration/tests/api/tests_mailcow_client.py|91|
mailcow_integration/tests/api/tests_mailcow_client.py|93|
mailcow_integration/tests/api/tests_mailcow_client.py|96|
mailcow_integration/tests/api/tests_mailcow_client.py|100|
mailcow_integration/tests/api/tests_mailcow_client.py|107|
mailcow_integration/tests/api/tests_mailcow_client.py|114|
mailcow_integration/tests/api/tests_mailcow_client.py|121|
mailcow_integration/tests/api/tests_mailcow_client.py|128|
mailcow_integration/tests/api/tests_mailcow_client.py|135|
mailcow_integration/tests/api/tests_mailcow_client.py|142|
mailcow_integration/tests/api/tests_mailcow_client.py|152|
mailcow_integration/tests/api/tests_mailcow_client.py|157|
mailcow_integration/tests/api/tests_mailcow_client.py|168|
mailcow_integration/tests/api/tests_mailcow_client.py|172|
mailcow_integration/tests/api/tests_mailcow_client.py|182|
mailcow_integration/tests/api/tests_mailcow_client.py|187|
mailcow_integration/tests/api/tests_mailcow_client.py|199|
mailcow_integration/tests/api/tests_mailcow_client.py|212|
mailcow_integration/tests/api/tests_mailcow_client.py|221|
mailcow_integration/tests/api/tests_mailcow_client.py|234|
mailcow_integration/tests/api/tests_mailcow_client.py|240|
mailcow_integration/tests/api/tests_mailcow_client.py|242|
mailcow_integration/tests/api/tests_mailcow_client.py|247|
mailcow_integration/tests/api/tests_mailcow_client.py|253|
mailcow_integration/tests/api/tests_mailcow_client.py|255|
mailcow_integration/tests/api/tests_mailcow_client.py|260|
mailcow_integration/tests/api/tests_mailcow_client.py|265|
mailcow_integration/tests/api/tests_mailcow_client.py|277|
mailcow_integration/tests/api/tests_mailcow_client.py|287|
mailcow_integration/tests/api/tests_mailcow_client.py|296|
mailcow_integration/tests/api/tests_mailcow_client.py|306|
mailcow_integration/tests/api/tests_mailcow_client.py|312|
mailcow_integration/tests/api/tests_mailcow_client.py|314|
mailcow_integration/tests/api/tests_mailcow_client.py|319|
mailcow_integration/tests/api/tests_mailcow_client.py|325|
mailcow_integration/tests/api/tests_mailcow_client.py|327|
mailcow_integration/tests/api/tests_mailcow_client.py|332|
mailcow_integration/tests/api/tests_mailcow_client.py|339|
mailcow_integration/tests/api/tests_mailcow_client.py|356|
mailcow_integration/tests/api/tests_mailcow_client.py|361|
mailcow_integration/tests/api/tests_mailcow_client.py|372|
mailcow_integration/tests/api/tests_mailcow_client.py|376|
mailcow_integration/tests/api/tests_mailcow_client.py|381|
mailcow_integration/tests/api/tests_mailcow_client.py|393|
mailcow_integration/tests/api/tests_mailcow_client.py|397|
mailcow_integration/tests/api/tests_mailcow_client.py|407|
mailcow_integration/tests/api/tests_mailcow_client.py|410|
mailcow_integration/tests/api/tests_mailcow_client.py|422|
mailcow_integration/tests/api/tests_mailcow_client.py|432|
mailcow_integration/tests/api/tests_mailcow_client.py|435|
mailcow_integration/tests/api/tests_mailcow_client.py|447|
mailcow_integration/tests/tests_member_preferences.py|13|
mailcow_integration/tests/tests_member_preferences.py|24|
mailcow_integration/tests/tests_member_preferences.py|27|
mailcow_integration/tests/tests_member_preferences.py|35|
mailcow_integration/tests/tests_member_preferences.py|38|
mailcow_integration/tests/tests_member_preferences.py|44|
mailcow_integration/tests/tests_member_preferences.py|46|
mailcow_integration/tests/tests_member_preferences.py|48|
mailcow_integration/tests/tests_member_preferences.py|56|
mailcow_integration/tests/tests_member_preferences.py|58|
mailcow_integration/tests/tests_member_preferences.py|60|
mailcow_integration/tests/tests_preferences.py|13 col 1|
mailcow_integration/tests/tests_preferences.py|14|
mailcow_integration/tests/tests_preferences.py|16|
mailcow_integration/tests/tests_preferences.py|23|
mailcow_integration/tests/tests_preferences.py|27|
mailcow_integration/tests/tests_preferences.py|31|
mailcow_integration/tests/tests_signals.py|12 col 1|
mailcow_integration/tests/tests_signals.py|13|
mailcow_integration/tests/tests_signals.py|31 col 1|
mailcow_integration/tests/tests_signals.py|34 col 1|
mailcow_integration/tests/tests_signals.py|46|
mailcow_integration/tests/tests_signals.py|53|
mailcow_integration/tests/tests_signals.py|66|
mailcow_integration/tests/tests_signals.py|70|
mailcow_integration/tests/tests_signals.py|77|
mailcow_integration/tests/tests_signals.py|79|
mailcow_integration/tests/tests_signals.py|81|
mailcow_integration/tests/tests_signals.py|86|
mailcow_integration/tests/tests_signals.py|91|
mailcow_integration/tests/tests_signals.py|111|
mailcow_integration/tests/tests_signals.py|113|
mailcow_integration/tests/tests_signals.py|120|
mailcow_integration/tests/tests_signals.py|127|
mailcow_integration/tests/tests_signals.py|134|
mailcow_integration/tests/tests_signals.py|136|
mailcow_integration/tests/tests_signals.py|150|
mailcow_integration/tests/tests_signals.py|157|
mailcow_integration/tests/tests_signals.py|224|
mailcow_integration/tests/tests_signals.py|226|
mailcow_integration/tests/tests_signals.py|244|
mailcow_integration/tests/tests_signals.py|251|
mailcow_integration/tests/tests_signals.py|258|
mailcow_integration/tests/tests_signals.py|260|
mailcow_integration/tests/tests_signals.py|264|
mailcow_integration/tests/tests_signals.py|289|
mailcow_integration/tests/tests_signals.py|322|
mailcow_integration/tests/tests_signals.py|324|
mailcow_integration/tests/tests_signals.py|331|
mailcow_integration/tests/tests_signals.py|338|
mailcow_integration/tests/tests_signals.py|345|
mailcow_integration/tests/tests_signals.py|347|
mailcow_integration/tests/tests_signals.py|365|
mailcow_integration/tests/tests_signals.py|383|
mailcow_integration/tests/tests_signals.py|398|
mailcow_integration/tests/tests_signals.py|405|
mailcow_integration/tests/tests_signals.py|407|
mailcow_integration/tests/tests_signals.py|410|
mailcow_integration/tests/tests_signals.py|436|
mailcow_integration/tests/tests_signals.py|440|
mailcow_integration/tests/tests_signals.py|487|
mailcow_integration/tests/tests_signals.py|490|
mailcow_integration/tests/tests_squire_mailcow.py|26|
mailcow_integration/tests/tests_squire_mailcow.py|32|
mailcow_integration/tests/tests_squire_mailcow.py|39|
mailcow_integration/tests/tests_squire_mailcow.py|45|
mailcow_integration/tests/tests_squire_mailcow.py|47|
mailcow_integration/tests/tests_squire_mailcow.py|53|
mailcow_integration/tests/tests_squire_mailcow.py|59|
mailcow_integration/tests/tests_squire_mailcow.py|63|
mailcow_integration/tests/tests_squire_mailcow.py|69|
mailcow_integration/tests/tests_squire_mailcow.py|73|
mailcow_integration/tests/tests_squire_mailcow.py|77|
mailcow_integration/tests/tests_squire_mailcow.py|81|
mailcow_integration/tests/tests_squire_mailcow.py|103|
mailcow_integration/tests/tests_squire_mailcow.py|107|
mailcow_integration/tests/tests_squire_mailcow.py|112|
mailcow_integration/tests/tests_squire_mailcow.py|134|
mailcow_integration/tests/tests_squire_mailcow.py|142|
mailcow_integration/tests/tests_squire_mailcow.py|149|
mailcow_integration/tests/tests_squire_mailcow.py|152|
mailcow_integration/tests/tests_squire_mailcow.py|159|
mailcow_integration/tests/tests_squire_mailcow.py|165|
mailcow_integration/tests/tests_squire_mailcow.py|170|
mailcow_integration/tests/tests_squire_mailcow.py|185|
mailcow_integration/tests/tests_squire_mailcow.py|191|
mailcow_integration/tests/tests_squire_mailcow.py|197|
mailcow_integration/tests/tests_squire_mailcow.py|203|
mailcow_integration/tests/tests_squire_mailcow.py|208|
mailcow_integration/tests/tests_squire_mailcow.py|211|
mailcow_integration/tests/tests_squire_mailcow.py|217|
mailcow_integration/tests/tests_squire_mailcow.py|228|
mailcow_integration/tests/tests_squire_mailcow.py|241|
mailcow_integration/tests/tests_squire_mailcow.py|248|
mailcow_integration/tests/tests_squire_mailcow.py|252|
mailcow_integration/tests/tests_squire_mailcow.py|262|
mailcow_integration/tests/tests_squire_mailcow.py|267|
mailcow_integration/tests/tests_squire_mailcow.py|283|
mailcow_integration/tests/tests_squire_mailcow.py|293|
mailcow_integration/tests/tests_squire_mailcow.py|298|
mailcow_integration/tests/tests_squire_mailcow.py|305|
mailcow_integration/tests/tests_squire_mailcow.py|314|
mailcow_integration/tests/tests_squire_mailcow.py|324|
mailcow_integration/tests/tests_squire_mailcow.py|329|
mailcow_integration/tests/tests_squire_mailcow.py|344|
mailcow_integration/tests/tests_squire_mailcow.py|353|
mailcow_integration/tests/tests_squire_mailcow.py|358|
mailcow_integration/tests/tests_squire_mailcow.py|373|
mailcow_integration/tests/tests_squire_mailcow.py|385|
mailcow_integration/tests/tests_squire_mailcow.py|390|
mailcow_integration/tests/tests_squire_mailcow.py|406|
mailcow_integration/tests/tests_squire_mailcow.py|413|
mailcow_integration/tests/tests_squire_mailcow.py|438|
mailcow_integration/tests/tests_squire_mailcow.py|450|
mailcow_integration/tests/tests_squire_mailcow.py|453|
mailcow_integration/tests/tests_squire_mailcow.py|455|
mailcow_integration/tests/tests_squire_mailcow.py|459|
mailcow_integration/tests/tests_squire_mailcow.py|468|
mailcow_integration/tests/tests_squire_mailcow.py|474|
mailcow_integration/tests/tests_squire_mailcow.py|493|
mailcow_integration/tests/tests_squire_mailcow.py|506|
mailcow_integration/tests/tests_squire_mailcow.py|522|
mailcow_integration/tests/tests_squire_mailcow.py|533|
mailcow_integration/tests/tests_squire_mailcow.py|536|
mailcow_integration/tests/tests_squire_mailcow.py|539|
mailcow_integration/tests/tests_squire_mailcow.py|546|
mailcow_integration/tests/tests_squire_mailcow.py|554|
mailcow_integration/tests/tests_squire_mailcow.py|563|
mailcow_integration/tests/tests_squire_mailcow.py|567|
mailcow_integration/tests/tests_squire_mailcow.py|569|
mailcow_integration/tests/tests_squire_mailcow.py|572|
mailcow_integration/tests/tests_squire_mailcow.py|581|
mailcow_integration/tests/tests_squire_mailcow.py|583|
mailcow_integration/tests/tests_squire_mailcow.py|586|
mailcow_integration/tests/tests_squire_mailcow.py|601|
mailcow_integration/tests/tests_squire_mailcow.py|606|
mailcow_integration/tests/tests_squire_mailcow.py|610|
mailcow_integration/tests/tests_squire_mailcow.py|613|
mailcow_integration/tests/tests_view_status.py|11|
mailcow_integration/tests/tests_view_status.py|25 col 1|
mailcow_integration/tests/tests_view_status.py|26|
mailcow_integration/tests/tests_view_status.py|28|
mailcow_integration/tests/tests_view_status.py|33 col 1|
mailcow_integration/tests/tests_view_status.py|34|
mailcow_integration/tests/tests_view_status.py|46|
mailcow_integration/tests/tests_view_status.py|51|
mailcow_integration/tests/tests_view_status.py|53|
mailcow_integration/tests/tests_view_status.py|59|
mailcow_integration/tests/tests_view_status.py|64|
mailcow_integration/tests/tests_view_status.py|66|
mailcow_integration/tests/tests_view_status.py|70|
mailcow_integration/tests/tests_view_status.py|77|
mailcow_integration/tests/tests_view_status.py|79|
mailcow_integration/tests/tests_view_status.py|85|
mailcow_integration/tests/tests_view_status.py|88|
mailcow_integration/tests/tests_view_status.py|95|
mailcow_integration/tests/tests_view_status.py|98|
mailcow_integration/tests/tests_view_status.py|105|
mailcow_integration/tests/tests_view_status.py|107|
mailcow_integration/tests/tests_view_status.py|116|
mailcow_integration/tests/tests_view_status.py|123|
mailcow_integration/tests/tests_view_status.py|126|
mailcow_integration/tests/tests_view_status.py|133|
mailcow_integration/tests/tests_view_status.py|135|
mailcow_integration/tests/tests_view_status.py|144|
mailcow_integration/tests/tests_view_status.py|150 col 1|
mailcow_integration/tests/tests_view_status.py|151|
mailcow_integration/tests/tests_view_status.py|153|
mailcow_integration/tests/tests_view_status.py|155|
mailcow_integration/tests/tests_view_status.py|161|
mailcow_integration/tests/tests_view_status.py|163|
mailcow_integration/tests/tests_view_status.py|167|
mailcow_integration/tests/tests_view_status.py|171|
mailcow_integration/tests/tests_view_status.py|174|
mailcow_integration/tests/tests_view_status.py|180|
mailcow_integration/tests/tests_view_status.py|184|
mailcow_integration/tests/tests_view_status.py|188|
mailcow_integration/tests/tests_view_status.py|191|
mailcow_integration/tests/tests_view_status.py|198|
mailcow_integration/tests/tests_view_status.py|207|
mailcow_integration/tests/tests_view_status.py|214|
mailcow_integration/tests/tests_view_status.py|218|
mailcow_integration/tests/tests_view_status.py|223|
mailcow_integration/tests/tests_view_status.py|230|
mailcow_integration/tests/tests_view_status.py|243|
mailcow_integration/tests/tests_view_status.py|270|
mailcow_integration/tests/tests_view_status.py|279|
mailcow_integration/tests/tests_view_status.py|285|
mailcow_integration/tests/tests_view_status.py|287|
mailcow_integration/tests/tests_view_status.py|291|
mailcow_integration/tests/tests_view_status.py|299|
mailcow_integration/tests/tests_view_status.py|315|
mailcow_integration/tests/tests_view_status.py|326|
mailcow_integration/tests/tests_view_status.py|334|
mailcow_integration/tests/tests_view_status.py|337|
mailcow_integration/tests/tests_view_status.py|346|
mailcow_integration/tests/tests_view_status.py|356|
mailcow_integration/tests/tests_view_status.py|365|
mailcow_integration/tests/tests_view_status.py|374|
mailcow_integration/tests/tests_view_status.py|377|
mailcow_integration/tests/tests_view_status.py|386|
mailcow_integration/tests/tests_view_status.py|390|
mailcow_integration/tests/tests_view_status.py|395|
mailcow_integration/tests/tests_view_status.py|404|
mailcow_integration/tests/tests_view_status.py|414|
mailcow_integration/tests/tests_view_status.py|420|
mailcow_integration/tests/tests_view_status.py|429|
mailcow_integration/tests/tests_view_status.py|434|
mailcow_integration/tests/tests_view_status.py|445|
mailcow_integration/tests/tests_view_status.py|464|
mailcow_integration/tests/tests_view_status.py|479|
mailcow_integration/tests/tests_view_status.py|484|
mailcow_integration/tests/tests_view_status.py|490|
mailcow_integration/tests/tests_view_status.py|492|
mailcow_integration/tests/tests_view_status.py|496|
mailcow_integration/tests/tests_view_status.py|498|
mailcow_integration/tests/tests_view_status.py|502|
mailcow_integration/tests/tests_view_status.py|504|
mailcow_integration/tests/tests_view_status.py|507|
mailcow_integration/tests/tests_view_status.py|516|
mailcow_integration/tests/tests_view_status.py|532|
mailcow_integration/tests/tests_view_status.py|547|
mailcow_integration/tests/tests_view_status.py|562|
mailcow_integration/tests/tests_view_status.py|578|
mailcow_integration/tests/tests_view_status.py|591|
membership_file/models.py|19 col 1|
membership_file/models.py|21|
membership_file/models.py|27|
membership_file/models.py|36 col 1|
membership_file/models.py|44|
membership_file/models.py|152|
membership_file/models.py|260|
membership_file/models.py|264|
membership_file/models.py|271|
membership_file/models.py|275|
membership_file/tests/tests_model.py|13 col 1|
membership_file/tests/tests_model.py|14|
membership_file/tests/tests_model.py|17|
membership_file/tests/tests_model.py|27|
membership_file/tests/tests_model.py|32|
membership_file/tests/tests_model.py|44|
membership_file/tests/tests_model.py|54|
membership_file/tests/tests_model.py|70|
membership_file/tests/tests_model.py|78|
membership_file/tests/tests_model.py|93|
membership_file/tests/tests_model.py|126|
squire/settings.py|243|
squire/settings.py|375|
squire/settings.py|385|
squire/settings_mailcow.py|30|
squire/settings_mailcow.py|33|
squire/settings_mailcow.py|40|
utils/tests/test_views.py|139|
utils/tests/test_views.py|141 col 1|
utils/tests/test_views.py|170 col 1|
utils/tests/test_views.py|171|
utils/tests/test_views.py|181|
utils/tests/test_views.py|185|
utils/tests/test_views.py|191|
utils/tests/test_views.py|197|
utils/viewcollectives.py|57|
utils/viewcollectives.py|61|
utils/viewcollectives.py|65|
utils/viewcollectives.py|71|
utils/viewcollectives.py|77|
utils/viewcollectives.py|101 col 1|
utils/viewcollectives.py|103|
utils/viewcollectives.py|112|
utils/viewcollectives.py|156|
utils/viewcollectives.py|171|
utils/viewcollectives.py|207|
utils/viewcollectives.py|225|
utils/views.py|119|

Comment on lines +266 to +267
context['internal_alias_rspamd_setting'] = self.mailcow_manager.get_internal_alias_rspamd_setting(use_cache=False)
context['mailcow_host'] = self.mailcow_manager.mailcow_host

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
context['internal_alias_rspamd_setting'] = self.mailcow_manager.get_internal_alias_rspamd_setting(use_cache=False)
context['mailcow_host'] = self.mailcow_manager.mailcow_host
context["internal_alias_rspamd_setting"] = self.mailcow_manager.get_internal_alias_rspamd_setting(
use_cache=False
)
context["mailcow_host"] = self.mailcow_manager.mailcow_host

@@ -0,0 +1,18 @@

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change

@@ -0,0 +1,18 @@

class MailcowException(Exception):
""" General exception class for errors raised by the Mailcow API """

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
""" General exception class for errors raised by the Mailcow API """
"""General exception class for errors raised by the Mailcow API"""

""" General exception class for errors raised by the Mailcow API """

class MailcowAuthException(MailcowException):
""" Raised if authentication with the Mailcow server fails (invalid API key) """

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
""" Raised if authentication with the Mailcow server fails (invalid API key) """
"""Raised if authentication with the Mailcow server fails (invalid API key)"""

""" Raised if authentication with the Mailcow server fails (invalid API key) """

class MailcowAPIAccessDenied(MailcowException):
""" Raised if API access is denied for some IP """

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
""" Raised if API access is denied for some IP """
"""Raised if API access is denied for some IP"""

Comment on lines +63 to +66
""" Mailcow Mailbox """
username: str # Username is the id
name: str # Name appearing when sending an email
local_part: str = None # everything before the @example.com

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
""" Mailcow Mailbox """
username: str # Username is the id
name: str # Name appearing when sending an email
local_part: str = None # everything before the @example.com
"""Mailcow Mailbox"""
username: str # Username is the id
name: str # Name appearing when sending an email
local_part: str = None # everything before the @example.com

domain: str = None

active: MailboxStatus = MailboxStatus.ACTIVE
active_int: int = None # ??? Always identical to active

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
active_int: int = None # ??? Always identical to active
active_int: int = None # ??? Always identical to active

Comment on lines +72 to +76
messages: int = 0 # Number of messages in the mailbox
quota: int = 0 # in bytes; 0 for infinite
quota_used: int = 0 # in bytes
percent_in_use: Optional[int] = None # from 0-100, or None if N/A
max_new_quota: int = 0 # in bytes; maximum possible quota

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
messages: int = 0 # Number of messages in the mailbox
quota: int = 0 # in bytes; 0 for infinite
quota_used: int = 0 # in bytes
percent_in_use: Optional[int] = None # from 0-100, or None if N/A
max_new_quota: int = 0 # in bytes; maximum possible quota
messages: int = 0 # Number of messages in the mailbox
quota: int = 0 # in bytes; 0 for infinite
quota_used: int = 0 # in bytes
percent_in_use: Optional[int] = None # from 0-100, or None if N/A
max_new_quota: int = 0 # in bytes; maximum possible quota

Comment on lines +78 to +80
rl: bool = False # ???
rl_scope: str = "domain" # ??? E.g. 'domain'
is_relayed: bool = False # ???

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
rl: bool = False # ???
rl_scope: str = "domain" # ??? E.g. 'domain'
is_relayed: bool = False # ???
rl: bool = False # ???
rl_scope: str = "domain" # ??? E.g. 'domain'
is_relayed: bool = False # ???

last_pop3_login: Optional[datetime] = None

domain_xmpp: int = 0
domain_xmpp_prefix: str = "" # ???

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
domain_xmpp_prefix: str = "" # ???
domain_xmpp_prefix: str = "" # ???

Catch MailcowExceptions when working with the API.
@EricTRL EricTRL requested a review from DutcherNL June 23, 2023 10:51
utils/viewcollectives.py Outdated Show resolved Hide resolved

logger = logging.getLogger(__name__)

class AliasStatus(Enum):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a lot going on in this file that I don't believe should be in this file. Or at least not in this class. To me it feels like there should be a MailcowAlias class that contains all information such as status, info (currently AliasInfo) and even get_alias_status() and get_alias_exposure_route() logic. Otherwise I fear that the code may become hard to decipher/ update once we are gone.

That said, it's more about code clarity/readability than functionality, so I'm fine with approving this PR if you can refactor that in the coming months and update it in a later PR.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Delaying to a future PR would be appreciated. There's a few other refactors I'd like to make as well.

  1. Take a stab at "merging" some of the tabs on the account page. There's little reason for email preferences to be a tab separate from the main account settings/preferences (like site theming).
  2. Play around with task queue systems like Celery. This should not only reduce HTTP traffic, but also ensure that signals from cascade deletes will never cause a headache again.
  3. (possibly) have an overview somewhere of aliases you're a part of (committee, global committee, and subbed member)

The require_membership parameter for ViewCollectives now requires an active membership, rather than any membership whatsoever.

Adjusted testcases to ensure those members are active.
Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remaining comments which cannot be posted as a review comment to avoid GitHub Rate Limit

blackfmt

mailcow_integration/management/commands/mailcow_api_request.py|6|
mailcow_integration/management/commands/mailcow_api_request.py|10|
mailcow_integration/management/commands/mailcow_api_request.py|16|
mailcow_integration/signals.py|11|
mailcow_integration/signals.py|16|
mailcow_integration/signals.py|20 col 1|
mailcow_integration/signals.py|21|
mailcow_integration/signals.py|30 col 1|
mailcow_integration/signals.py|38 col 1|
mailcow_integration/signals.py|45 col 1|
mailcow_integration/signals.py|50|
mailcow_integration/signals.py|68 col 1|
mailcow_integration/signals.py|70|
mailcow_integration/signals.py|76|
mailcow_integration/signals.py|92 col 1|
mailcow_integration/signals.py|94|
mailcow_integration/signals.py|112|
mailcow_integration/signals.py|132 col 1|
mailcow_integration/signals.py|134|
mailcow_integration/signals.py|167|
mailcow_integration/signals.py|177 col 1|
mailcow_integration/signals.py|179|
mailcow_integration/signals.py|181|
mailcow_integration/signals.py|189 col 1|
mailcow_integration/signals.py|194|
mailcow_integration/signals.py|213 col 1|
mailcow_integration/signals.py|215|
mailcow_integration/signals.py|226|
mailcow_integration/signals.py|231|
mailcow_integration/signals.py|242 col 1|
mailcow_integration/signals.py|244|
mailcow_integration/signals.py|257|
mailcow_integration/signals.py|275 col 1|
mailcow_integration/signals.py|277|
mailcow_integration/signals.py|284|
mailcow_integration/signals.py|299 col 1|
mailcow_integration/signals.py|301|
mailcow_integration/signals.py|309 col 1|
mailcow_integration/signals.py|314|
mailcow_integration/signals.py|332 col 1|
mailcow_integration/signals.py|334|
mailcow_integration/signals.py|345|
mailcow_integration/signals.py|362 col 1|
mailcow_integration/signals.py|364|
mailcow_integration/signals.py|371 col 1|
mailcow_integration/signals.py|373|
mailcow_integration/signals.py|383 col 1|
mailcow_integration/signals.py|392|
mailcow_integration/signals.py|397|
mailcow_integration/signals.py|399|
mailcow_integration/signals.py|407|
mailcow_integration/squire_mailcow.py|22|
mailcow_integration/squire_mailcow.py|26 col 1|
mailcow_integration/squire_mailcow.py|27|
mailcow_integration/squire_mailcow.py|33|
mailcow_integration/squire_mailcow.py|38|
mailcow_integration/squire_mailcow.py|49 col 1|
mailcow_integration/squire_mailcow.py|65|
mailcow_integration/squire_mailcow.py|87|
mailcow_integration/squire_mailcow.py|93|
mailcow_integration/squire_mailcow.py|101|
mailcow_integration/squire_mailcow.py|106|
mailcow_integration/squire_mailcow.py|124|
mailcow_integration/squire_mailcow.py|134|
mailcow_integration/squire_mailcow.py|138|
mailcow_integration/squire_mailcow.py|163|
mailcow_integration/squire_mailcow.py|178|
mailcow_integration/squire_mailcow.py|186|
mailcow_integration/squire_mailcow.py|195|
mailcow_integration/squire_mailcow.py|199|
mailcow_integration/squire_mailcow.py|204|
mailcow_integration/squire_mailcow.py|208|
mailcow_integration/squire_mailcow.py|211|
mailcow_integration/squire_mailcow.py|232|
mailcow_integration/squire_mailcow.py|244|
mailcow_integration/squire_mailcow.py|251|
mailcow_integration/squire_mailcow.py|266|
mailcow_integration/squire_mailcow.py|269|
mailcow_integration/squire_mailcow.py|279|
mailcow_integration/squire_mailcow.py|294|
mailcow_integration/squire_mailcow.py|302|
mailcow_integration/squire_mailcow.py|316|
mailcow_integration/squire_mailcow.py|327|
mailcow_integration/squire_mailcow.py|331|
mailcow_integration/squire_mailcow.py|334|
mailcow_integration/squire_mailcow.py|346|
mailcow_integration/squire_mailcow.py|351|
mailcow_integration/squire_mailcow.py|353|
mailcow_integration/squire_mailcow.py|360|
mailcow_integration/squire_mailcow.py|362|
mailcow_integration/squire_mailcow.py|373|
mailcow_integration/tests/api/test_interfaces.py|6|
mailcow_integration/tests/api/test_interfaces.py|11|
mailcow_integration/tests/api/test_interfaces.py|30|
mailcow_integration/tests/api/test_interfaces.py|71|
mailcow_integration/tests/api/test_interfaces.py|81|
mailcow_integration/tests/api/test_interfaces.py|83|
mailcow_integration/tests/api/test_interfaces.py|90|
mailcow_integration/tests/api/test_interfaces.py|92|
mailcow_integration/tests/api/test_interfaces.py|100|
mailcow_integration/tests/api/test_interfaces.py|128|
mailcow_integration/tests/api/test_interfaces.py|133|
mailcow_integration/tests/api/tests_mailcow_client.py|23 col 1|
mailcow_integration/tests/api/tests_mailcow_client.py|24|
mailcow_integration/tests/api/tests_mailcow_client.py|31|
mailcow_integration/tests/api/tests_mailcow_client.py|34|
mailcow_integration/tests/api/tests_mailcow_client.py|38|
mailcow_integration/tests/api/tests_mailcow_client.py|46|
mailcow_integration/tests/api/tests_mailcow_client.py|48|
mailcow_integration/tests/api/tests_mailcow_client.py|50|
mailcow_integration/tests/api/tests_mailcow_client.py|55|
mailcow_integration/tests/api/tests_mailcow_client.py|62|
mailcow_integration/tests/api/tests_mailcow_client.py|66|
mailcow_integration/tests/api/tests_mailcow_client.py|75|
mailcow_integration/tests/api/tests_mailcow_client.py|80|
mailcow_integration/tests/api/tests_mailcow_client.py|87|
mailcow_integration/tests/api/tests_mailcow_client.py|89|
mailcow_integration/tests/api/tests_mailcow_client.py|91|
mailcow_integration/tests/api/tests_mailcow_client.py|93|
mailcow_integration/tests/api/tests_mailcow_client.py|96|
mailcow_integration/tests/api/tests_mailcow_client.py|100|
mailcow_integration/tests/api/tests_mailcow_client.py|107|
mailcow_integration/tests/api/tests_mailcow_client.py|114|
mailcow_integration/tests/api/tests_mailcow_client.py|121|
mailcow_integration/tests/api/tests_mailcow_client.py|128|
mailcow_integration/tests/api/tests_mailcow_client.py|135|
mailcow_integration/tests/api/tests_mailcow_client.py|142|
mailcow_integration/tests/api/tests_mailcow_client.py|152|
mailcow_integration/tests/api/tests_mailcow_client.py|157|
mailcow_integration/tests/api/tests_mailcow_client.py|168|
mailcow_integration/tests/api/tests_mailcow_client.py|172|
mailcow_integration/tests/api/tests_mailcow_client.py|182|
mailcow_integration/tests/api/tests_mailcow_client.py|187|
mailcow_integration/tests/api/tests_mailcow_client.py|199|
mailcow_integration/tests/api/tests_mailcow_client.py|212|
mailcow_integration/tests/api/tests_mailcow_client.py|221|
mailcow_integration/tests/api/tests_mailcow_client.py|234|
mailcow_integration/tests/api/tests_mailcow_client.py|240|
mailcow_integration/tests/api/tests_mailcow_client.py|242|
mailcow_integration/tests/api/tests_mailcow_client.py|247|
mailcow_integration/tests/api/tests_mailcow_client.py|253|
mailcow_integration/tests/api/tests_mailcow_client.py|255|
mailcow_integration/tests/api/tests_mailcow_client.py|260|
mailcow_integration/tests/api/tests_mailcow_client.py|265|
mailcow_integration/tests/api/tests_mailcow_client.py|277|
mailcow_integration/tests/api/tests_mailcow_client.py|287|
mailcow_integration/tests/api/tests_mailcow_client.py|296|
mailcow_integration/tests/api/tests_mailcow_client.py|306|
mailcow_integration/tests/api/tests_mailcow_client.py|312|
mailcow_integration/tests/api/tests_mailcow_client.py|314|
mailcow_integration/tests/api/tests_mailcow_client.py|319|
mailcow_integration/tests/api/tests_mailcow_client.py|325|
mailcow_integration/tests/api/tests_mailcow_client.py|327|
mailcow_integration/tests/api/tests_mailcow_client.py|332|
mailcow_integration/tests/api/tests_mailcow_client.py|339|
mailcow_integration/tests/api/tests_mailcow_client.py|356|
mailcow_integration/tests/api/tests_mailcow_client.py|361|
mailcow_integration/tests/api/tests_mailcow_client.py|372|
mailcow_integration/tests/api/tests_mailcow_client.py|376|
mailcow_integration/tests/api/tests_mailcow_client.py|381|
mailcow_integration/tests/api/tests_mailcow_client.py|393|
mailcow_integration/tests/api/tests_mailcow_client.py|397|
mailcow_integration/tests/api/tests_mailcow_client.py|407|
mailcow_integration/tests/api/tests_mailcow_client.py|410|
mailcow_integration/tests/api/tests_mailcow_client.py|422|
mailcow_integration/tests/api/tests_mailcow_client.py|432|
mailcow_integration/tests/api/tests_mailcow_client.py|435|
mailcow_integration/tests/api/tests_mailcow_client.py|447|
mailcow_integration/tests/tests_member_preferences.py|13|
mailcow_integration/tests/tests_member_preferences.py|24|
mailcow_integration/tests/tests_member_preferences.py|27|
mailcow_integration/tests/tests_member_preferences.py|35|
mailcow_integration/tests/tests_member_preferences.py|38|
mailcow_integration/tests/tests_member_preferences.py|44|
mailcow_integration/tests/tests_member_preferences.py|46|
mailcow_integration/tests/tests_member_preferences.py|48|
mailcow_integration/tests/tests_member_preferences.py|56|
mailcow_integration/tests/tests_member_preferences.py|58|
mailcow_integration/tests/tests_member_preferences.py|60|
mailcow_integration/tests/tests_preferences.py|13 col 1|
mailcow_integration/tests/tests_preferences.py|14|
mailcow_integration/tests/tests_preferences.py|16|
mailcow_integration/tests/tests_preferences.py|23|
mailcow_integration/tests/tests_preferences.py|27|
mailcow_integration/tests/tests_preferences.py|31|
mailcow_integration/tests/tests_signals.py|14 col 1|
mailcow_integration/tests/tests_signals.py|15|
mailcow_integration/tests/tests_signals.py|27 col 1|
mailcow_integration/tests/tests_signals.py|28|
mailcow_integration/tests/tests_signals.py|35 col 1|
mailcow_integration/tests/tests_signals.py|38 col 1|
mailcow_integration/tests/tests_signals.py|50|
mailcow_integration/tests/tests_signals.py|57|
mailcow_integration/tests/tests_signals.py|59|
mailcow_integration/tests/tests_signals.py|63|
mailcow_integration/tests/tests_signals.py|70|
mailcow_integration/tests/tests_signals.py|72|
mailcow_integration/tests/tests_signals.py|74|
mailcow_integration/tests/tests_signals.py|79|
mailcow_integration/tests/tests_signals.py|84|
mailcow_integration/tests/tests_signals.py|104|
mailcow_integration/tests/tests_signals.py|106|
mailcow_integration/tests/tests_signals.py|113|
mailcow_integration/tests/tests_signals.py|120|
mailcow_integration/tests/tests_signals.py|127|
mailcow_integration/tests/tests_signals.py|129|
mailcow_integration/tests/tests_signals.py|143|
mailcow_integration/tests/tests_signals.py|150|
mailcow_integration/tests/tests_signals.py|217|
mailcow_integration/tests/tests_signals.py|219|
mailcow_integration/tests/tests_signals.py|237|
mailcow_integration/tests/tests_signals.py|244|
mailcow_integration/tests/tests_signals.py|251|
mailcow_integration/tests/tests_signals.py|253|
mailcow_integration/tests/tests_signals.py|257|
mailcow_integration/tests/tests_signals.py|282|
mailcow_integration/tests/tests_signals.py|315|
mailcow_integration/tests/tests_signals.py|317|
mailcow_integration/tests/tests_signals.py|324|
mailcow_integration/tests/tests_signals.py|331|
mailcow_integration/tests/tests_signals.py|338|
mailcow_integration/tests/tests_signals.py|340|
mailcow_integration/tests/tests_signals.py|358|
mailcow_integration/tests/tests_signals.py|376|
mailcow_integration/tests/tests_signals.py|391|
mailcow_integration/tests/tests_signals.py|398|
mailcow_integration/tests/tests_signals.py|400|
mailcow_integration/tests/tests_signals.py|403|
mailcow_integration/tests/tests_signals.py|429|
mailcow_integration/tests/tests_signals.py|433|
mailcow_integration/tests/tests_signals.py|480|
mailcow_integration/tests/tests_signals.py|483|
mailcow_integration/tests/tests_signals.py|514|
mailcow_integration/tests/tests_signals.py|517|
mailcow_integration/tests/tests_signals.py|522|
mailcow_integration/tests/tests_squire_mailcow.py|27|
mailcow_integration/tests/tests_squire_mailcow.py|33|
mailcow_integration/tests/tests_squire_mailcow.py|40|
mailcow_integration/tests/tests_squire_mailcow.py|46|
mailcow_integration/tests/tests_squire_mailcow.py|48|
mailcow_integration/tests/tests_squire_mailcow.py|54|
mailcow_integration/tests/tests_squire_mailcow.py|60|
mailcow_integration/tests/tests_squire_mailcow.py|64|
mailcow_integration/tests/tests_squire_mailcow.py|70|
mailcow_integration/tests/tests_squire_mailcow.py|74|
mailcow_integration/tests/tests_squire_mailcow.py|78|
mailcow_integration/tests/tests_squire_mailcow.py|82|
mailcow_integration/tests/tests_squire_mailcow.py|104|
mailcow_integration/tests/tests_squire_mailcow.py|108|
mailcow_integration/tests/tests_squire_mailcow.py|113|
mailcow_integration/tests/tests_squire_mailcow.py|135|
mailcow_integration/tests/tests_squire_mailcow.py|143|
mailcow_integration/tests/tests_squire_mailcow.py|150|
mailcow_integration/tests/tests_squire_mailcow.py|153|
mailcow_integration/tests/tests_squire_mailcow.py|160|
mailcow_integration/tests/tests_squire_mailcow.py|166|
mailcow_integration/tests/tests_squire_mailcow.py|171|
mailcow_integration/tests/tests_squire_mailcow.py|186|
mailcow_integration/tests/tests_squire_mailcow.py|192|
mailcow_integration/tests/tests_squire_mailcow.py|198|
mailcow_integration/tests/tests_squire_mailcow.py|204|
mailcow_integration/tests/tests_squire_mailcow.py|209|
mailcow_integration/tests/tests_squire_mailcow.py|212|
mailcow_integration/tests/tests_squire_mailcow.py|218|
mailcow_integration/tests/tests_squire_mailcow.py|229|
mailcow_integration/tests/tests_squire_mailcow.py|242|
mailcow_integration/tests/tests_squire_mailcow.py|249|
mailcow_integration/tests/tests_squire_mailcow.py|253|
mailcow_integration/tests/tests_squire_mailcow.py|263|
mailcow_integration/tests/tests_squire_mailcow.py|268|
mailcow_integration/tests/tests_squire_mailcow.py|284|
mailcow_integration/tests/tests_squire_mailcow.py|294|
mailcow_integration/tests/tests_squire_mailcow.py|299|
mailcow_integration/tests/tests_squire_mailcow.py|306|
mailcow_integration/tests/tests_squire_mailcow.py|315|
mailcow_integration/tests/tests_squire_mailcow.py|325|
mailcow_integration/tests/tests_squire_mailcow.py|330|
mailcow_integration/tests/tests_squire_mailcow.py|345|
mailcow_integration/tests/tests_squire_mailcow.py|354|
mailcow_integration/tests/tests_squire_mailcow.py|359|
mailcow_integration/tests/tests_squire_mailcow.py|374|
mailcow_integration/tests/tests_squire_mailcow.py|386|
mailcow_integration/tests/tests_squire_mailcow.py|391|
mailcow_integration/tests/tests_squire_mailcow.py|408|
mailcow_integration/tests/tests_squire_mailcow.py|415|
mailcow_integration/tests/tests_squire_mailcow.py|422|
mailcow_integration/tests/tests_squire_mailcow.py|447|
mailcow_integration/tests/tests_squire_mailcow.py|459|
mailcow_integration/tests/tests_squire_mailcow.py|462|
mailcow_integration/tests/tests_squire_mailcow.py|464|
mailcow_integration/tests/tests_squire_mailcow.py|468|
mailcow_integration/tests/tests_squire_mailcow.py|477|
mailcow_integration/tests/tests_squire_mailcow.py|483|
mailcow_integration/tests/tests_squire_mailcow.py|503|
mailcow_integration/tests/tests_squire_mailcow.py|516|
mailcow_integration/tests/tests_squire_mailcow.py|521|
mailcow_integration/tests/tests_squire_mailcow.py|525|
mailcow_integration/tests/tests_squire_mailcow.py|538|
mailcow_integration/tests/tests_squire_mailcow.py|549|
mailcow_integration/tests/tests_squire_mailcow.py|552|
mailcow_integration/tests/tests_squire_mailcow.py|555|
mailcow_integration/tests/tests_squire_mailcow.py|563|
mailcow_integration/tests/tests_squire_mailcow.py|573|
mailcow_integration/tests/tests_squire_mailcow.py|577|
mailcow_integration/tests/tests_squire_mailcow.py|586|
mailcow_integration/tests/tests_squire_mailcow.py|590|
mailcow_integration/tests/tests_squire_mailcow.py|592|
mailcow_integration/tests/tests_squire_mailcow.py|595|
mailcow_integration/tests/tests_squire_mailcow.py|605|
mailcow_integration/tests/tests_squire_mailcow.py|607|
mailcow_integration/tests/tests_squire_mailcow.py|610|
mailcow_integration/tests/tests_squire_mailcow.py|619|
mailcow_integration/tests/tests_squire_mailcow.py|631|
mailcow_integration/tests/tests_squire_mailcow.py|636|
mailcow_integration/tests/tests_squire_mailcow.py|640|
mailcow_integration/tests/tests_squire_mailcow.py|643|
mailcow_integration/tests/tests_view_status.py|11|
mailcow_integration/tests/tests_view_status.py|25 col 1|
mailcow_integration/tests/tests_view_status.py|26|
mailcow_integration/tests/tests_view_status.py|28|
mailcow_integration/tests/tests_view_status.py|33 col 1|
mailcow_integration/tests/tests_view_status.py|34|
mailcow_integration/tests/tests_view_status.py|46|
mailcow_integration/tests/tests_view_status.py|51|
mailcow_integration/tests/tests_view_status.py|53|
mailcow_integration/tests/tests_view_status.py|59|
mailcow_integration/tests/tests_view_status.py|64|
mailcow_integration/tests/tests_view_status.py|66|
mailcow_integration/tests/tests_view_status.py|70|
mailcow_integration/tests/tests_view_status.py|77|
mailcow_integration/tests/tests_view_status.py|79|
mailcow_integration/tests/tests_view_status.py|85|
mailcow_integration/tests/tests_view_status.py|88|
mailcow_integration/tests/tests_view_status.py|95|
mailcow_integration/tests/tests_view_status.py|98|
mailcow_integration/tests/tests_view_status.py|105|
mailcow_integration/tests/tests_view_status.py|107|
mailcow_integration/tests/tests_view_status.py|116|
mailcow_integration/tests/tests_view_status.py|123|
mailcow_integration/tests/tests_view_status.py|126|
mailcow_integration/tests/tests_view_status.py|133|
mailcow_integration/tests/tests_view_status.py|135|
mailcow_integration/tests/tests_view_status.py|144|
mailcow_integration/tests/tests_view_status.py|150 col 1|
mailcow_integration/tests/tests_view_status.py|151|
mailcow_integration/tests/tests_view_status.py|153|
mailcow_integration/tests/tests_view_status.py|155|
mailcow_integration/tests/tests_view_status.py|161|
mailcow_integration/tests/tests_view_status.py|163|
mailcow_integration/tests/tests_view_status.py|167|
mailcow_integration/tests/tests_view_status.py|171|
mailcow_integration/tests/tests_view_status.py|174|
mailcow_integration/tests/tests_view_status.py|180|
mailcow_integration/tests/tests_view_status.py|184|
mailcow_integration/tests/tests_view_status.py|188|
mailcow_integration/tests/tests_view_status.py|191|
mailcow_integration/tests/tests_view_status.py|198|
mailcow_integration/tests/tests_view_status.py|207|
mailcow_integration/tests/tests_view_status.py|214|
mailcow_integration/tests/tests_view_status.py|218|
mailcow_integration/tests/tests_view_status.py|223|
mailcow_integration/tests/tests_view_status.py|230|
mailcow_integration/tests/tests_view_status.py|243|
mailcow_integration/tests/tests_view_status.py|270|
mailcow_integration/tests/tests_view_status.py|279|
mailcow_integration/tests/tests_view_status.py|285|
mailcow_integration/tests/tests_view_status.py|287|
mailcow_integration/tests/tests_view_status.py|291|
mailcow_integration/tests/tests_view_status.py|299|
mailcow_integration/tests/tests_view_status.py|315|
mailcow_integration/tests/tests_view_status.py|326|
mailcow_integration/tests/tests_view_status.py|334|
mailcow_integration/tests/tests_view_status.py|337|
mailcow_integration/tests/tests_view_status.py|346|
mailcow_integration/tests/tests_view_status.py|356|
mailcow_integration/tests/tests_view_status.py|365|
mailcow_integration/tests/tests_view_status.py|374|
mailcow_integration/tests/tests_view_status.py|377|
mailcow_integration/tests/tests_view_status.py|386|
mailcow_integration/tests/tests_view_status.py|390|
mailcow_integration/tests/tests_view_status.py|395|
mailcow_integration/tests/tests_view_status.py|404|
mailcow_integration/tests/tests_view_status.py|414|
mailcow_integration/tests/tests_view_status.py|420|
mailcow_integration/tests/tests_view_status.py|429|
mailcow_integration/tests/tests_view_status.py|434|
mailcow_integration/tests/tests_view_status.py|445|
mailcow_integration/tests/tests_view_status.py|464|
mailcow_integration/tests/tests_view_status.py|479|
mailcow_integration/tests/tests_view_status.py|484|
mailcow_integration/tests/tests_view_status.py|490|
mailcow_integration/tests/tests_view_status.py|492|
mailcow_integration/tests/tests_view_status.py|496|
mailcow_integration/tests/tests_view_status.py|498|
mailcow_integration/tests/tests_view_status.py|502|
mailcow_integration/tests/tests_view_status.py|504|
mailcow_integration/tests/tests_view_status.py|507|
mailcow_integration/tests/tests_view_status.py|517|
mailcow_integration/tests/tests_view_status.py|533|
mailcow_integration/tests/tests_view_status.py|548|
mailcow_integration/tests/tests_view_status.py|563|
mailcow_integration/tests/tests_view_status.py|578|
mailcow_integration/tests/tests_view_status.py|596|
mailcow_integration/tests/tests_view_status.py|609|
membership_file/models.py|19 col 1|
membership_file/models.py|21|
membership_file/models.py|27|
membership_file/models.py|36 col 1|
membership_file/models.py|44|
membership_file/models.py|152|
membership_file/models.py|260|
membership_file/models.py|264|
membership_file/models.py|271|
membership_file/models.py|275|
membership_file/tests/tests_model.py|13 col 1|
membership_file/tests/tests_model.py|14|
membership_file/tests/tests_model.py|17|
membership_file/tests/tests_model.py|27|
membership_file/tests/tests_model.py|32|
membership_file/tests/tests_model.py|44|
membership_file/tests/tests_model.py|54|
membership_file/tests/tests_model.py|70|
membership_file/tests/tests_model.py|78|
membership_file/tests/tests_model.py|93|
membership_file/tests/tests_model.py|126|
squire/settings.py|243|
squire/settings.py|375|
squire/settings.py|385|
squire/settings_mailcow.py|30|
squire/settings_mailcow.py|33|
squire/settings_mailcow.py|40|
utils/tests/test_views.py|139|
utils/tests/test_views.py|141 col 1|
utils/tests/test_views.py|170 col 1|
utils/tests/test_views.py|171|
utils/tests/test_views.py|181|
utils/tests/test_views.py|185|
utils/tests/test_views.py|191|
utils/tests/test_views.py|197|
utils/viewcollectives.py|57|
utils/viewcollectives.py|61|
utils/viewcollectives.py|69|
utils/viewcollectives.py|75|
utils/viewcollectives.py|99 col 1|
utils/viewcollectives.py|101|
utils/viewcollectives.py|110|
utils/viewcollectives.py|154|
utils/viewcollectives.py|169|
utils/viewcollectives.py|205|
utils/viewcollectives.py|223|
utils/views.py|119|

Comment on lines +372 to +373
fixtures = ["test_users.json", "test_activity_slots", "test_members.json",
"activity_calendar/test_activity_organisers",

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
fixtures = ["test_users.json", "test_activity_slots", "test_members.json",
"activity_calendar/test_activity_organisers",
fixtures = [
"test_users.json",
"test_activity_slots",
"test_members.json",
"activity_calendar/test_activity_organisers",

if error is None:
messages.success(self.request, f"Orphan data deleted: {', '.join(unused_addresses)}.")
else:
messages.error(self.request, f"Error deleting data: {', '.join(unused_addresses)}.\nException: {error}")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
messages.error(self.request, f"Error deleting data: {', '.join(unused_addresses)}.\nException: {error}")
messages.error(
self.request, f"Error deleting data: {', '.join(unused_addresses)}.\nException: {error}"
)

else:
return HttpResponseBadRequest("Invalid alias_type passed")

for (addr, e) in errors:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
for (addr, e) in errors:
for addr, e in errors:

Comment on lines +89 to +91
spam_aliases: int = 0 # ???
pushover_active: bool = False # Push notification settings
percent_class: str = "success" # ??? E.g. 'success'

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
spam_aliases: int = 0 # ???
pushover_active: bool = False # Push notification settings
percent_class: str = "success" # ??? E.g. 'success'
spam_aliases: int = 0 # ???
pushover_active: bool = False # Push notification settings
percent_class: str = "success" # ??? E.g. 'success'

def __post_init__(self):
index = self.username.find("@")
if self.local_part is None:
self.local_part = self.username[index + 1:]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
self.local_part = self.username[index + 1:]
self.local_part = self.username[index + 1 :]

Comment on lines +41 to +42
if not alias_data['internal']:
label_elements.append('<span class="badge badge-primary badge-pill"><i class="fas fas fa-globe"></i> Public</span>')

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
if not alias_data['internal']:
label_elements.append('<span class="badge badge-primary badge-pill"><i class="fas fas fa-globe"></i> Public</span>')
if not alias_data["internal"]:
label_elements.append(
'<span class="badge badge-primary badge-pill"><i class="fas fas fa-globe"></i> Public</span>'
)

Comment on lines +46 to +47
' '.join(label_elements),
alias_data['description'],

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
' '.join(label_elements),
alias_data['description'],
" ".join(label_elements),
alias_data["description"],


section = mail
name = alias_address_to_id(alias_address)
default = alias_data['default_opt']

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
default = alias_data['default_opt']
default = alias_data["default_opt"]

# help_text = ''

field_kwargs = {
'disabled': not alias_data['allow_opt_out'],

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
'disabled': not alias_data['allow_opt_out'],
"disabled": not alias_data["allow_opt_out"],

'disabled': not alias_data['allow_opt_out'],
}

register_preferences(settings.MEMBER_ALIASES)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blackfmt] reported by reviewdog 🐶

Suggested change
register_preferences(settings.MEMBER_ALIASES)
register_preferences(settings.MEMBER_ALIASES)

@EricTRL EricTRL merged commit 5411925 into master Aug 19, 2023
0 of 4 checks passed
@EricTRL EricTRL deleted the feature/mailcow-email-lists branch August 19, 2023 10:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
admin The Admin Panel for Back-end stuff downloads Newsletter and other downloadable content feature membership file Related to the membership file feature
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants