diff --git a/src/servala/core/models/organization.py b/src/servala/core/models/organization.py index 6fd6c67..fec3fa4 100644 --- a/src/servala/core/models/organization.py +++ b/src/servala/core/models/organization.py @@ -27,6 +27,12 @@ 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 + ) + class Meta: verbose_name = _("Organization") verbose_name_plural = _("Organizations") diff --git a/src/servala/frontend/forms/__init__.py b/src/servala/frontend/forms/__init__.py new file mode 100644 index 0000000..8169b61 --- /dev/null +++ b/src/servala/frontend/forms/__init__.py @@ -0,0 +1,3 @@ +from .organization import OrganizationCreateForm + +__all__ = ["OrganizationCreateForm"] diff --git a/src/servala/frontend/forms/organization.py b/src/servala/frontend/forms/organization.py new file mode 100644 index 0000000..b6a3391 --- /dev/null +++ b/src/servala/frontend/forms/organization.py @@ -0,0 +1,9 @@ +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/templates/frontend/organizations/create.html b/src/servala/frontend/templates/frontend/organizations/create.html new file mode 100644 index 0000000..ca46190 --- /dev/null +++ b/src/servala/frontend/templates/frontend/organizations/create.html @@ -0,0 +1,16 @@ +{% extends "frontend/base.html" %} +{% load i18n %} +{% block html_title %} + {% block page_title %} + {% translate "Create a new organization" %} + {% endblock page_title %} +{% endblock html_title %} +{% block content %} + + + + {% include "includes/form.html" %} + + + +{% endblock content %} diff --git a/src/servala/frontend/templates/includes/sidebar.html b/src/servala/frontend/templates/includes/sidebar.html index e3c62f4..8c47293 100644 --- a/src/servala/frontend/templates/includes/sidebar.html +++ b/src/servala/frontend/templates/includes/sidebar.html @@ -87,7 +87,7 @@ {% elif current_organization %} {% translate "Organization" %}: {{ current_organization.name }} {% else %} - + {% translate "Create organization" %} diff --git a/src/servala/frontend/urls.py b/src/servala/frontend/urls.py index b9a0c6b..fbaaa08 100644 --- a/src/servala/frontend/urls.py +++ b/src/servala/frontend/urls.py @@ -5,5 +5,10 @@ from servala.frontend import views urlpatterns = [ path("accounts/profile/", views.ProfileView.as_view(), name="profile"), path("accounts/logout/", views.LogoutView.as_view(), name="logout"), + path( + "organizations/create", + views.OrganizationCreateView.as_view(), + name="organization.create", + ), path("", views.IndexView.as_view(), name="index"), ] diff --git a/src/servala/frontend/views/__init__.py b/src/servala/frontend/views/__init__.py index 3fc930c..20b4398 100644 --- a/src/servala/frontend/views/__init__.py +++ b/src/servala/frontend/views/__init__.py @@ -1,8 +1,10 @@ from .auth import LogoutView from .generic import IndexView, ProfileView +from .organization import OrganizationCreateView __all__ = [ "IndexView", "LogoutView", + "OrganizationCreateView", "ProfileView", ] diff --git a/src/servala/frontend/views/organization.py b/src/servala/frontend/views/organization.py new file mode 100644 index 0000000..9bc1397 --- /dev/null +++ b/src/servala/frontend/views/organization.py @@ -0,0 +1,16 @@ +from django.views.generic import FormView + +from servala.frontend.forms import OrganizationCreateForm + + +class OrganizationCreateView(FormView): + form_class = OrganizationCreateForm + template_name = "frontend/organizations/create.html" + + def form_valid(self, form): + form.save() + form.instance.set_owner(self.request.user) + return super().form_valid(form) + + def get_success_url(self): + return "/"