Skip to content

Commit ee2539c

Browse files
committed
Merge branch 'master' into release
2 parents 36d8fce + ba4c4e5 commit ee2539c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+167
-49
lines changed

.flake8

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
[flake8]
2+
exclude =
3+
.git,
4+
__pycache__
5+
select = CLB100

.pre-commit-config.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ repos:
3030
args: [--target-version, '4.2', '--skip', 'admin_register']
3131
files: '^docker-app/qfieldcloud/.*.py$'
3232

33+
- repo: https://github.com/pycqa/flake8
34+
rev: '7.1.2'
35+
hooks:
36+
- id: flake8
37+
additional_dependencies: [flake8-clean-block]
38+
3339
# Lint and format
3440
- repo: https://github.com/astral-sh/ruff-pre-commit
3541
# Ruff version.

docker-app/manage.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ def main():
1313
"available on your PYTHONPATH environment variable? Did you "
1414
"forget to activate a virtual environment?"
1515
) from exc
16+
1617
execute_from_command_line(sys.argv)
1718

1819

docker-app/qfieldcloud/authentication/apps.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ def initialize(cls):
1414

1515
if cls.initialized:
1616
return
17+
1718
cls.initialized = True
1819

1920
from .conf import settings # noqa

docker-app/qfieldcloud/authentication/auth_backends.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,5 @@ def get_user(self, user_id):
3838
user = UserModel.objects.get(pk=user_id)
3939
except UserModel.DoesNotExist:
4040
return None
41+
4142
return user if self.user_can_authenticate(user) else None

docker-app/qfieldcloud/authentication/models.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,11 @@ def save(self, *args, **kwargs) -> None:
9999
if self.client_type in self.single_token_clients:
100100
# expire all other tokens
101101
now = timezone.now()
102+
102103
AuthToken.objects.filter(
103104
user=self.user,
104105
client_type=self.client_type,
105106
expires_at__gt=now,
106107
).exclude(pk=self.pk).update(expires_at=now)
108+
107109
return super().save(*args, **kwargs)

docker-app/qfieldcloud/core/admin.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ def get_ordering(self, request, queryset):
7878
order_fields = super().get_ordering(request, queryset)
7979
if len(order_fields) > 1 and "-pk" in order_fields:
8080
order_fields.remove("-pk")
81+
8182
return order_fields
8283

8384

@@ -108,6 +109,7 @@ def has_delete_permission(self, request, obj=None):
108109
"""
109110
if hasattr(self, "has_direct_delete_permission"):
110111
perm = f"admin:{self.model._meta.app_label}_{self.model._meta.model_name}"
112+
111113
if request.resolver_match.view_name.startswith(perm):
112114
if callable(self.has_direct_delete_permission):
113115
return self.has_direct_delete_permission(request, obj)
@@ -367,16 +369,19 @@ class MemberOrganizationInline(admin.TabularInline):
367369
def has_add_permission(self, request, obj):
368370
if obj is None:
369371
return True
372+
370373
return obj.type in (User.Type.PERSON, User.Type.ORGANIZATION)
371374

372375
def has_direct_delete_permission(self, request, obj):
373376
if obj is None:
374377
return True
378+
375379
return obj.type in (User.Type.PERSON, User.Type.ORGANIZATION)
376380

377381
def has_change_permission(self, request, obj):
378382
if obj is None:
379383
return True
384+
380385
return obj.type in (User.Type.PERSON, User.Type.ORGANIZATION)
381386

382387

@@ -387,16 +392,19 @@ class MemberTeamInline(admin.TabularInline):
387392
def has_add_permission(self, request, obj):
388393
if obj is None:
389394
return True
395+
390396
return obj.type in (User.Type.PERSON, User.Type.ORGANIZATION)
391397

392398
def has_direct_delete_permission(self, request, obj):
393399
if obj is None:
394400
return True
401+
395402
return obj.type in (User.Type.PERSON, User.Type.ORGANIZATION)
396403

397404
def has_change_permission(self, request, obj):
398405
if obj is None:
399406
return True
407+
400408
return obj.type in (User.Type.PERSON, User.Type.ORGANIZATION)
401409

402410

@@ -434,16 +442,19 @@ class UserProjectCollaboratorInline(admin.TabularInline):
434442
def has_add_permission(self, request, obj):
435443
if obj is None:
436444
return True
445+
437446
return obj.type == User.Type.PERSON
438447

439448
def has_direct_delete_permission(self, request, obj):
440449
if obj is None:
441450
return True
451+
442452
return obj.type == User.Type.PERSON
443453

444454
def has_change_permission(self, request, obj):
445455
if obj is None:
446456
return True
457+
447458
return obj.type == User.Type.PERSON
448459

449460

@@ -540,6 +551,7 @@ def get_urls(self):
540551
name="password_reset_url",
541552
),
542553
]
554+
543555
return urls
544556

545557
@method_decorator(never_cache)
@@ -565,6 +577,7 @@ def password_reset_url(self, request, user_id, form_url=""):
565577
"key": token_generator.make_token(user),
566578
},
567579
)
580+
568581
return TemplateResponse(
569582
request,
570583
"admin/password_reset_url.html",
@@ -623,6 +636,7 @@ class Meta:
623636
def get_initial_for_field(self, field, field_name):
624637
if self.instance.pk and field_name == "value":
625638
return ""
639+
626640
return super().get_initial_for_field(field, field_name)
627641

628642
def clean(self):
@@ -632,9 +646,11 @@ def clean(self):
632646
type = self.instance.type
633647
else:
634648
type = cleaned_data.get("type")
649+
635650
if type == Secret.Type.PGSERVICE:
636651
# validate the pg_service.conf
637652
value = cleaned_data.get("value")
653+
638654
if value:
639655
try:
640656
pg_service_file.validate_pg_service_conf(value)
@@ -686,6 +702,7 @@ def save_model(self, request, obj, form, change):
686702
# only set created_by during the first save
687703
if not change:
688704
obj.created_by = request.user
705+
689706
super().save_model(request, obj, form, change)
690707

691708
def get_changeform_initial_data(self, request):
@@ -798,7 +815,10 @@ class ProjectAdmin(QFieldCloudModelAdmin):
798815
"data_last_packaged_at",
799816
"project_details__pre",
800817
)
801-
inlines = (ProjectCollaboratorInline, ProjectSecretInline)
818+
inlines = (
819+
ProjectSecretInline,
820+
ProjectCollaboratorInline,
821+
)
802822
search_fields = (
803823
"id",
804824
"name__icontains",
@@ -962,8 +982,10 @@ def get_queryset(self, request):
962982

963983
def get_object(self, request, object_id, from_field=None):
964984
obj = super().get_object(request, object_id, from_field)
985+
965986
if obj and obj.type == Job.Type.DELTA_APPLY:
966987
obj = ApplyJob.objects.get(pk=obj.pk)
988+
967989
return obj
968990

969991
def get_inline_instances(self, request, obj=None):
@@ -1297,8 +1319,8 @@ class OrganizationAdmin(QFieldCloudModelAdmin):
12971319
inlines = (
12981320
UserAccountInline,
12991321
GeodbInline,
1300-
OrganizationMemberInline,
13011322
ProjectInline,
1323+
OrganizationMemberInline,
13021324
TeamInline,
13031325
)
13041326
fields = (
@@ -1339,8 +1361,10 @@ class OrganizationAdmin(QFieldCloudModelAdmin):
13391361
def active_users_links(self, instance) -> str:
13401362
persons = instance.useraccount.current_subscription.active_users
13411363
userlinks = "<p> - </p>"
1364+
13421365
if persons:
13431366
userlinks = "<br>".join(model_admin_url(p, p.username) for p in persons)
1367+
13441368
help_text = """
13451369
<p style="font-size: 11px; color: var(--body-quiet-color)">
13461370
Active members have triggererd at least one job or uploaded at least one delta in the current billing period.
@@ -1428,6 +1452,7 @@ class TeamAdmin(QFieldCloudModelAdmin):
14281452
def save_model(self, request, obj, form, change):
14291453
if not obj.username.startswith("@"):
14301454
obj.username = f"@{obj.team_organization.username}/{obj.username}"
1455+
14311456
obj.save()
14321457

14331458
def get_form(

docker-app/qfieldcloud/core/constance_backends.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,16 @@ class DatabaseBackend(BaseDatabaseBackend):
1313

1414
def get(self, key):
1515
key = self.add_prefix(key)
16+
1617
if self._cache:
1718
value = self._cache.get(key)
19+
1820
if value is None:
1921
self.autofill()
2022
value = self._cache.get(key)
2123
else:
2224
value = None
25+
2326
if value is None:
2427
try:
2528
value = self._model._default_manager.get(key=key).value
@@ -28,4 +31,5 @@ def get(self, key):
2831
self._cache.add(key, value)
2932
except self._model.DoesNotExist: # Only catch DoesNotExist exceptions here
3033
pass
34+
3135
return value

docker-app/qfieldcloud/core/drf_utils.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ def _get_query_field(self, fields: Iterable[str], term: str) -> str | None:
3939
continue
4040

4141
return field
42+
4243
return None
4344

4445
def _parse_tokenized_attributes(self, raw: str) -> dict[str, str]:

docker-app/qfieldcloud/core/models.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -710,10 +710,12 @@ def active_users(self, period_since: datetime, period_until: datetime):
710710

711711
def save(self, *args, **kwargs):
712712
self.type = User.Type.ORGANIZATION
713+
713714
if getattr(self, "created_by", None) is not None:
714715
self.created_by = self.created_by
715716
else:
716717
self.created_by = self.organization_owner
718+
717719
return super().save(*args, **kwargs)
718720

719721

@@ -1821,6 +1823,7 @@ def get_feedback_step_data(self, step_name: str) -> dict[str, Any] | None:
18211823
for step in self.feedback["steps"]:
18221824
if step["id"] == step_name:
18231825
return step
1826+
18241827
return None
18251828

18261829

0 commit comments

Comments
 (0)