diff --git a/.env.example b/.env.example index 940a6d0..03e6d4d 100644 --- a/.env.example +++ b/.env.example @@ -36,7 +36,3 @@ SERVALA_EMAIL_SSL='False' # If the default OrganizationOrigin is **not** the one with the database ID 1, set it here. SERVALA_DEFAULT_ORIGIN='1' - -SERVALA_KEYCLOAK_CLIENT_ID='portal.servala.com' -SERVALA_KEYCLOAK_CLIENT_SECRET='' -SERVALA_KEYCLOAK_SERVER_URL='' diff --git a/pyproject.toml b/pyproject.toml index 1893952..bdc67c2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,13 +6,9 @@ readme = "README.md" requires-python = ">=3.12" dependencies = [ "argon2-cffi>=23.1.0", - "cryptography>=44.0.2", "django==5.2b1", - "django-allauth>=65.5.0", "pillow>=11.1.0", "psycopg2-binary>=2.9.10", - "pyjwt>=2.10.1", - "requests>=2.32.3", ] [dependency-groups] @@ -34,6 +30,3 @@ known_first_party = "servala" [tool.flake8] max-line-length = 160 exclude = ".venv" - -[tool.djlint] -extend_exclude = "src/servala/static/mazer" diff --git a/src/servala/core/migrations/0002_billingentity_created_at_billingentity_updated_at_and_more.py b/src/servala/core/migrations/0002_billingentity_created_at_billingentity_updated_at_and_more.py deleted file mode 100644 index 83d5c00..0000000 --- a/src/servala/core/migrations/0002_billingentity_created_at_billingentity_updated_at_and_more.py +++ /dev/null @@ -1,89 +0,0 @@ -# Generated by Django 5.2b1 on 2025-03-17 06:19 - -import django.utils.timezone -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("core", "0001_initial"), - ] - - operations = [ - migrations.AddField( - model_name="billingentity", - name="created_at", - field=models.DateTimeField( - auto_now_add=True, - default=django.utils.timezone.now, - verbose_name="Created", - ), - preserve_default=False, - ), - migrations.AddField( - model_name="billingentity", - name="updated_at", - field=models.DateTimeField(auto_now=True, verbose_name="Last updated"), - ), - migrations.AddField( - model_name="organization", - name="created_at", - field=models.DateTimeField( - auto_now_add=True, - default=django.utils.timezone.now, - verbose_name="Created", - ), - preserve_default=False, - ), - migrations.AddField( - model_name="organization", - name="updated_at", - field=models.DateTimeField(auto_now=True, verbose_name="Last updated"), - ), - migrations.AddField( - model_name="organizationmembership", - name="created_at", - field=models.DateTimeField( - auto_now_add=True, - default=django.utils.timezone.now, - verbose_name="Created", - ), - preserve_default=False, - ), - migrations.AddField( - model_name="organizationmembership", - name="updated_at", - field=models.DateTimeField(auto_now=True, verbose_name="Last updated"), - ), - migrations.AddField( - model_name="organizationorigin", - name="created_at", - field=models.DateTimeField( - auto_now_add=True, - default=django.utils.timezone.now, - verbose_name="Created", - ), - preserve_default=False, - ), - migrations.AddField( - model_name="organizationorigin", - name="updated_at", - field=models.DateTimeField(auto_now=True, verbose_name="Last updated"), - ), - migrations.AddField( - model_name="user", - name="created_at", - field=models.DateTimeField( - auto_now_add=True, - default=django.utils.timezone.now, - verbose_name="Created", - ), - preserve_default=False, - ), - migrations.AddField( - model_name="user", - name="updated_at", - field=models.DateTimeField(auto_now=True, verbose_name="Last updated"), - ), - ] diff --git a/src/servala/core/models/mixins.py b/src/servala/core/models/mixins.py deleted file mode 100644 index ac8c3b0..0000000 --- a/src/servala/core/models/mixins.py +++ /dev/null @@ -1,15 +0,0 @@ -from django.db import models -from django.utils.translation import gettext_lazy as _ - - -class ServalaModelMixin(models.Model): - created_at = models.DateTimeField( - auto_now_add=True, editable=False, verbose_name=_("Created") - ) - updated_at = models.DateTimeField( - auto_now=True, editable=False, verbose_name=_("Last updated") - ) - - class Meta: - abstract = True - ordering = ("-created_at",) diff --git a/src/servala/core/models/organization.py b/src/servala/core/models/organization.py index 0419175..ce0b43d 100644 --- a/src/servala/core/models/organization.py +++ b/src/servala/core/models/organization.py @@ -1,11 +1,8 @@ -from django.conf import settings from django.db import models from django.utils.translation import gettext_lazy as _ -from .mixins import ServalaModelMixin - -class Organization(ServalaModelMixin, models.Model): +class Organization(models.Model): name = models.CharField(max_length=100, verbose_name=_("Name")) billing_entity = models.ForeignKey( @@ -28,24 +25,6 @@ class Organization(ServalaModelMixin, models.Model): verbose_name=_("Members"), ) - def set_owner(self, user): - OrganizationMembership.objects.filter(user=user, organization=self).delete() - OrganizationMembership.objects.create( - user=user, organization=self, role=OrganizationRole.OWNER - ) - - @classmethod - def create_organization(cls, instance, owner): - try: - instance.origin - except Exception: - instance.origin = OrganizationOrigin.objects.get( - pk=settings.SERVALA_DEFAULT_ORIGIN - ) - instance.save() - instance.set_owner(owner) - return instance - class Meta: verbose_name = _("Organization") verbose_name_plural = _("Organizations") @@ -54,7 +33,7 @@ class Organization(ServalaModelMixin, models.Model): return self.name -class BillingEntity(ServalaModelMixin, models.Model): +class BillingEntity(models.Model): """ Every organization has a billing entity, though billing entities may be shared across different organizations. @@ -74,7 +53,7 @@ class BillingEntity(ServalaModelMixin, models.Model): return self.name -class OrganizationOrigin(ServalaModelMixin, models.Model): +class OrganizationOrigin(models.Model): """ Every organization has an origin, though origins may be shared across different organizations. The default origin @@ -98,7 +77,7 @@ class OrganizationRole(models.TextChoices): OWNER = "owner", _("Owner") -class OrganizationMembership(ServalaModelMixin, models.Model): +class OrganizationMembership(models.Model): """Through-model for the many-to-many relationship between organizations and users.""" user = models.ForeignKey( diff --git a/src/servala/core/models/user.py b/src/servala/core/models/user.py index 12545a8..66f420d 100644 --- a/src/servala/core/models/user.py +++ b/src/servala/core/models/user.py @@ -2,8 +2,6 @@ from django.contrib.auth.models import AbstractBaseUser, BaseUserManager from django.db import models from django.utils.translation import gettext_lazy as _ -from .mixins import ServalaModelMixin - class UserManager(BaseUserManager): """ @@ -32,7 +30,7 @@ class UserManager(BaseUserManager): return self.create_user(email, password, **extra_fields) -class User(ServalaModelMixin, AbstractBaseUser): +class User(AbstractBaseUser): """The Django model provides a password and last_login field.""" objects = UserManager() diff --git a/src/servala/frontend/__init__.py b/src/servala/frontend/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/servala/frontend/apps.py b/src/servala/frontend/apps.py deleted file mode 100644 index 31c808f..0000000 --- a/src/servala/frontend/apps.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class FrontendConfig(AppConfig): - default_auto_field = "django.db.models.BigAutoField" - name = "servala.frontend" diff --git a/src/servala/frontend/context_processors.py b/src/servala/frontend/context_processors.py deleted file mode 100644 index 1a180d8..0000000 --- a/src/servala/frontend/context_processors.py +++ /dev/null @@ -1,5 +0,0 @@ -def add_organizations(request): - if not request.user.is_authenticated: - return {"user_organizations": []} - - return {"user_organizations": request.user.organizations.all()} diff --git a/src/servala/frontend/forms/__init__.py b/src/servala/frontend/forms/__init__.py deleted file mode 100644 index 8169b61..0000000 --- a/src/servala/frontend/forms/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .organization import OrganizationCreateForm - -__all__ = ["OrganizationCreateForm"] diff --git a/src/servala/frontend/forms/auth.py b/src/servala/frontend/forms/auth.py deleted file mode 100644 index 3bd8a89..0000000 --- a/src/servala/frontend/forms/auth.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.forms import Form - -from servala.core.models.user import User - - -class ServalaSignupForm(Form): - company = User._meta.get_field("company").formfield() - - def signup(self, request, user): - user.company = self.cleaned_data.get("company") - user.save() diff --git a/src/servala/frontend/forms/organization.py b/src/servala/frontend/forms/organization.py deleted file mode 100644 index b6a3391..0000000 --- a/src/servala/frontend/forms/organization.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.forms import ModelForm - -from servala.core.models import Organization - - -class OrganizationCreateForm(ModelForm): - class Meta: - model = Organization - fields = ("name",) diff --git a/src/servala/frontend/forms/renderers.py b/src/servala/frontend/forms/renderers.py deleted file mode 100644 index f8cdb5d..0000000 --- a/src/servala/frontend/forms/renderers.py +++ /dev/null @@ -1,28 +0,0 @@ -from django.forms.renderers import TemplatesSetting - - -def inject_class(f, class_name): - def inner(*args, **kwargs): - result = f(*args, **kwargs) - class_list = result.get("class", "") - class_list = f"{class_list} {class_name}".strip() - result["class"] = class_list - return result - - return inner - - -class VerticalFormRenderer(TemplatesSetting): - form_template_name = "frontend/forms/form.html" - field_template_name = "frontend/forms/vertical_field.html" - - def render(self, template_name, context, request=None): - if field := context.get("field"): - if field.field.widget.input_type == "checkbox": - class_name = "form-check-input" - else: - class_name = "form-control" - field.build_widget_attrs = inject_class( - field.build_widget_attrs, class_name - ) - return super().render(template_name, context, request) diff --git a/src/servala/frontend/templates/account/login.html b/src/servala/frontend/templates/account/login.html deleted file mode 100644 index 5a31aea..0000000 --- a/src/servala/frontend/templates/account/login.html +++ /dev/null @@ -1,45 +0,0 @@ -{% extends "frontend/base.html" %} -{% load static i18n %} -{% load allauth account socialaccount %} -{% block html_title %} - {% block page_title %} - {% translate "Sign In" %} - {% endblock page_title %} -{% endblock html_title %} -{% block card_content %} - {% if SOCIALACCOUNT_ENABLED %} - {% get_providers as socialaccount_providers %} - {% if socialaccount_providers %} - {% for provider in socialaccount_providers %} - {% provider_login_url provider process=process scope=scope auth_params=auth_params as href %} -
- {% endfor %} - {% endif %} - {% endif %} -