diff --git a/orchestra/contrib/musician/forms.py b/orchestra/contrib/musician/forms.py
index 00d69ba3..fa7f4503 100644
--- a/orchestra/contrib/musician/forms.py
+++ b/orchestra/contrib/musician/forms.py
@@ -2,8 +2,6 @@ from django import forms
from django.contrib.auth.forms import AuthenticationForm
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
-from django.utils.encoding import force_str
-from orchestra.forms.widgets import DynamicHelpTextSelect
from django.contrib.auth.hashers import make_password
@@ -11,13 +9,8 @@ from orchestra.contrib.domains.models import Domain, Record
from orchestra.contrib.mailboxes.models import Address, Mailbox
from orchestra.contrib.systemusers.models import WebappUsers, SystemUser
from orchestra.contrib.musician.validators import ValidateZoneMixin
-from orchestra.contrib.webapps.models import WebApp, WebAppOption
-from orchestra.contrib.webapps.options import AppOption
-from orchestra.contrib.webapps.types import AppType
-from orchestra.contrib.websites.models import Website
from . import api
-from .settings import MUSICIAN_EDIT_ENABLE_PHP_OPTIONS
class LoginForm(AuthenticationForm):
@@ -209,82 +202,3 @@ class SystemUsersChangePasswordForm(ChangePasswordForm):
fields = ("password",)
model = SystemUser
-
-class WebappOptionForm(forms.ModelForm):
-
- OPTIONS_HELP_TEXT = {
- op.name: force_str(op.help_text) for op in AppOption.get_plugins()
- }
-
- class Meta:
- model = WebAppOption
- fields = ("name", "value")
-
- def __init__(self, *args, **kwargs):
- try:
- self.webapp = kwargs.pop('webapp')
- super().__init__(*args, **kwargs)
- except:
- super().__init__(*args, **kwargs)
- self.webapp = self.instance.webapp
-
- target = 'this.id.replace("name", "value")'
- self.fields['name'].widget.attrs = DynamicHelpTextSelect(target, self.OPTIONS_HELP_TEXT).attrs
-
- def save(self, commit=True):
- instance = super().save(commit=False)
- instance.webapp = self.webapp
- if commit:
- super().save(commit=True)
- self.webapp.save()
- return instance
-
-
-class WebappOptionCreateForm(WebappOptionForm):
-
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- plugin = AppType.get(self.webapp.type)
- choices = list(plugin.get_group_options_choices())
- for grupo, opciones in enumerate(choices):
- if isinstance(opciones[1], list):
- nueva_lista = [opc for opc in opciones[1] if opc[0] in MUSICIAN_EDIT_ENABLE_PHP_OPTIONS]
- choices[grupo] = (opciones[0], nueva_lista)
- self.fields['name'].widget.choices = choices
-
- def clean(self):
- cleaned_data = super().clean()
- name = self.cleaned_data.get("name")
- if WebAppOption.objects.filter(webapp=self.webapp, name=name).exists():
- raise ValidationError(_("This option already exist."))
- return cleaned_data
-
-class WebappOptionUpdateForm(WebappOptionForm):
-
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self.fields['name'].widget.choices = [(self.initial['name'], self.initial['name'])]
-
-
-class WebsiteUpdateForm(forms.ModelForm):
- class Meta:
- model = Website
- fields = ("is_active", "protocol", "domains")
- help_texts = {
- 'domains': _('Hold down "Control", or "Command" on a Mac, to select more than one.')
- }
-
- def __init__(self, *args, **kwargs):
- self.user = kwargs.pop('user')
- super().__init__(*args, **kwargs)
- # Excluir dominios de otros websites
- qs = Website.objects.filter(account=self.user).exclude(id=self.instance.id)
- used_domains = []
- for website in qs:
- dominios = website.domains.all()
- for dominio in dominios:
- used_domains.append(dominio)
- self.fields['domains'].queryset = Domain.objects.filter(account=self.user).exclude(name__in=used_domains)
-
-
-
diff --git a/orchestra/contrib/musician/templates/musician/webapp_detail.html b/orchestra/contrib/musician/templates/musician/webapps/webapp_detail.html
similarity index 100%
rename from orchestra/contrib/musician/templates/musician/webapp_detail.html
rename to orchestra/contrib/musician/templates/musician/webapps/webapp_detail.html
diff --git a/orchestra/contrib/musician/templates/musician/webapp_form.html b/orchestra/contrib/musician/templates/musician/webapps/webapp_form.html
similarity index 100%
rename from orchestra/contrib/musician/templates/musician/webapp_form.html
rename to orchestra/contrib/musician/templates/musician/webapps/webapp_form.html
diff --git a/orchestra/contrib/musician/templates/musician/webapp_list.html b/orchestra/contrib/musician/templates/musician/webapps/webapp_list.html
similarity index 100%
rename from orchestra/contrib/musician/templates/musician/webapp_list.html
rename to orchestra/contrib/musician/templates/musician/webapps/webapp_list.html
diff --git a/orchestra/contrib/musician/templates/musician/webapp_option_form.html b/orchestra/contrib/musician/templates/musician/webapps/webapp_option_form.html
similarity index 100%
rename from orchestra/contrib/musician/templates/musician/webapp_option_form.html
rename to orchestra/contrib/musician/templates/musician/webapps/webapp_option_form.html
diff --git a/orchestra/contrib/musician/templates/musician/webappoption_check_delete.html b/orchestra/contrib/musician/templates/musician/webapps/webappoption_check_delete.html
similarity index 100%
rename from orchestra/contrib/musician/templates/musician/webappoption_check_delete.html
rename to orchestra/contrib/musician/templates/musician/webapps/webappoption_check_delete.html
diff --git a/orchestra/contrib/musician/templates/musician/webappuser_change_password.html b/orchestra/contrib/musician/templates/musician/webapps/webappuser_change_password.html
similarity index 100%
rename from orchestra/contrib/musician/templates/musician/webappuser_change_password.html
rename to orchestra/contrib/musician/templates/musician/webapps/webappuser_change_password.html
diff --git a/orchestra/contrib/musician/templates/musician/webappuser_list.html b/orchestra/contrib/musician/templates/musician/webapps/webappuser_list.html
similarity index 94%
rename from orchestra/contrib/musician/templates/musician/webappuser_list.html
rename to orchestra/contrib/musician/templates/musician/webapps/webappuser_list.html
index bde24e3a..c2ae2713 100644
--- a/orchestra/contrib/musician/templates/musician/webappuser_list.html
+++ b/orchestra/contrib/musician/templates/musician/webapps/webappuser_list.html
@@ -31,7 +31,6 @@
{% endfor %}
- {% include "musician/components/table_paginator.html" %}
{% endblock %}
diff --git a/orchestra/contrib/musician/templates/musician/website_form.html b/orchestra/contrib/musician/templates/musician/websites/website_create_option_form.html
similarity index 75%
rename from orchestra/contrib/musician/templates/musician/website_form.html
rename to orchestra/contrib/musician/templates/musician/websites/website_create_option_form.html
index 9304bc36..b72f3c4a 100644
--- a/orchestra/contrib/musician/templates/musician/website_form.html
+++ b/orchestra/contrib/musician/templates/musician/websites/website_create_option_form.html
@@ -7,8 +7,7 @@
{% trans "Go back" %}
- {% if form.instance.pk %}{% trans "Update Option of Website" %}{% else %}{% trans "Add Option to" %}{% endif %}
- {{ website.name }}
+ {% trans "Add Option to" %} {{ form.website.name }}
{% endblock %}
-
diff --git a/orchestra/contrib/musician/templates/musician/website_detail.html b/orchestra/contrib/musician/templates/musician/websites/website_detail.html
similarity index 95%
rename from orchestra/contrib/musician/templates/musician/website_detail.html
rename to orchestra/contrib/musician/templates/musician/websites/website_detail.html
index 7528f242..d3c3b0ce 100644
--- a/orchestra/contrib/musician/templates/musician/website_detail.html
+++ b/orchestra/contrib/musician/templates/musician/websites/website_detail.html
@@ -64,7 +64,7 @@
{% endfor %}
-
+{% trans "Assigned new Webapp" %}
{% trans "Directives" %}
diff --git a/orchestra/contrib/musician/templates/musician/websites/website_form.html b/orchestra/contrib/musician/templates/musician/websites/website_form.html
new file mode 100644
index 00000000..131a5ef1
--- /dev/null
+++ b/orchestra/contrib/musician/templates/musician/websites/website_form.html
@@ -0,0 +1,31 @@
+{% extends "musician/base.html" %}
+{% load bootstrap4 i18n %}
+
+
+{% block content %}
+
+
+
+{% trans "Go back" %}
+
+
+ {% trans "Update Option of Website" %} {{ website.name }}
+
+
+
+{% endblock %}
+
diff --git a/orchestra/contrib/musician/templates/musician/website_list.html b/orchestra/contrib/musician/templates/musician/websites/website_list.html
similarity index 82%
rename from orchestra/contrib/musician/templates/musician/website_list.html
rename to orchestra/contrib/musician/templates/musician/websites/website_list.html
index 1f75a980..f8fd0724 100644
--- a/orchestra/contrib/musician/templates/musician/website_list.html
+++ b/orchestra/contrib/musician/templates/musician/websites/website_list.html
@@ -38,9 +38,6 @@
{{ website.is_active|yesno }}
-
|
@@ -55,7 +52,7 @@
Webapp Dir |
/home/{{ content.webapp.account }}/webapps/{{ content.webapp }} |
-
+
|
@@ -107,22 +104,4 @@
-
-
-
{% endblock %}
\ No newline at end of file
diff --git a/orchestra/contrib/musician/templates/musician/websiteoption_check_delete.html b/orchestra/contrib/musician/templates/musician/websites/websiteoption_check_delete.html
similarity index 100%
rename from orchestra/contrib/musician/templates/musician/websiteoption_check_delete.html
rename to orchestra/contrib/musician/templates/musician/websites/websiteoption_check_delete.html
diff --git a/orchestra/contrib/musician/tidy_forms/__init__.py b/orchestra/contrib/musician/tidy_forms/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orchestra/contrib/musician/tidy_forms/webapps.py b/orchestra/contrib/musician/tidy_forms/webapps.py
new file mode 100644
index 00000000..a6e64b19
--- /dev/null
+++ b/orchestra/contrib/musician/tidy_forms/webapps.py
@@ -0,0 +1,69 @@
+from django import forms
+from orchestra.forms.widgets import DynamicHelpTextSelect
+
+from django.core.exceptions import ValidationError
+from django.utils.translation import gettext_lazy as _
+from django.utils.encoding import force_str
+
+from orchestra.contrib.webapps.models import WebApp, WebAppOption
+from orchestra.contrib.webapps.options import AppOption
+from orchestra.contrib.webapps.types import AppType
+
+from orchestra.contrib.musician.settings import MUSICIAN_EDIT_ENABLE_PHP_OPTIONS
+
+
+
+class WebappOptionForm(forms.ModelForm):
+
+ OPTIONS_HELP_TEXT = {
+ op.name: force_str(op.help_text) for op in AppOption.get_plugins()
+ }
+
+ class Meta:
+ model = WebAppOption
+ fields = ("name", "value")
+
+ def __init__(self, *args, **kwargs):
+ try:
+ self.webapp = kwargs.pop('webapp')
+ super().__init__(*args, **kwargs)
+ except:
+ super().__init__(*args, **kwargs)
+ self.webapp = self.instance.webapp
+
+ target = 'this.id.replace("name", "value")'
+ self.fields['name'].widget.attrs = DynamicHelpTextSelect(target, self.OPTIONS_HELP_TEXT).attrs
+
+ def save(self, commit=True):
+ instance = super().save(commit=False)
+ instance.webapp = self.webapp
+ if commit:
+ super().save(commit=True)
+ self.webapp.save()
+ return instance
+
+
+class WebappOptionCreateForm(WebappOptionForm):
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ plugin = AppType.get(self.webapp.type)
+ choices = list(plugin.get_group_options_choices())
+ for grupo, opciones in enumerate(choices):
+ if isinstance(opciones[1], list):
+ nueva_lista = [opc for opc in opciones[1] if opc[0] in MUSICIAN_EDIT_ENABLE_PHP_OPTIONS]
+ choices[grupo] = (opciones[0], nueva_lista)
+ self.fields['name'].widget.choices = choices
+
+ def clean(self):
+ cleaned_data = super().clean()
+ name = self.cleaned_data.get("name")
+ if WebAppOption.objects.filter(webapp=self.webapp, name=name).exists():
+ raise ValidationError(_("This option already exist."))
+ return cleaned_data
+
+class WebappOptionUpdateForm(WebappOptionForm):
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.fields['name'].widget.choices = [(self.initial['name'], self.initial['name'])]
diff --git a/orchestra/contrib/musician/tidy_forms/websites.py b/orchestra/contrib/musician/tidy_forms/websites.py
new file mode 100644
index 00000000..d1cd2ef5
--- /dev/null
+++ b/orchestra/contrib/musician/tidy_forms/websites.py
@@ -0,0 +1,61 @@
+from django import forms
+from orchestra.forms.widgets import DynamicHelpTextSelect
+
+from django.core.exceptions import ValidationError
+from django.utils.translation import gettext_lazy as _
+
+from orchestra.contrib.websites.models import Website, Content, WebsiteDirective
+from orchestra.contrib.webapps.models import WebApp
+from orchestra.contrib.domains.models import Domain
+
+
+
+class WebsiteUpdateForm(forms.ModelForm):
+ class Meta:
+ model = Website
+ fields = ("is_active", "protocol", "domains")
+ help_texts = {
+ 'domains': _('Hold down "Control", or "Command" on a Mac, to select more than one.')
+ }
+
+ def __init__(self, *args, **kwargs):
+ self.user = kwargs.pop('user')
+ super().__init__(*args, **kwargs)
+ # Excluir dominios de otros websites
+ qs = Website.objects.filter(account=self.user).exclude(id=self.instance.id)
+ used_domains = []
+ for website in qs:
+ dominios = website.domains.all()
+ for dominio in dominios:
+ used_domains.append(dominio)
+ self.fields['domains'].queryset = Domain.objects.filter(account=self.user).exclude(name__in=used_domains)
+
+
+class WesiteContentCreateForm(forms.ModelForm):
+
+ class Meta:
+ model = Content
+ fields = ("webapp", "path")
+
+ def __init__(self, *args, **kwargs):
+ self.website = kwargs.pop('website')
+ self.user = kwargs.pop('user')
+ super().__init__(*args, **kwargs)
+ self.fields['webapp'].queryset = WebApp.objects.filter(account=self.user, target_server=self.website.target_server)
+
+ def clean(self):
+ cleaned_data = super().clean()
+ path = self.cleaned_data.get("path")
+ path = "/" if path == "" else path
+ print(f"mypath: {path}")
+ if Content.objects.filter(website=self.website, path=path).exists():
+ self.add_error('path',_("This Path already exists on this Website."))
+ return cleaned_data
+
+ def save(self, commit=True):
+ instance = super().save(commit=False)
+ instance.website = self.website
+ if commit:
+ super().save(commit=True)
+ self.website.save()
+ return instance
\ No newline at end of file
diff --git a/orchestra/contrib/musician/tidy_views/__init__.py b/orchestra/contrib/musician/tidy_views/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/orchestra/contrib/musician/tidy_views/webapps.py b/orchestra/contrib/musician/tidy_views/webapps.py
new file mode 100644
index 00000000..f54e14de
--- /dev/null
+++ b/orchestra/contrib/musician/tidy_views/webapps.py
@@ -0,0 +1,102 @@
+from django.utils.translation import gettext_lazy as _
+from django.shortcuts import get_object_or_404
+from django.urls import reverse_lazy
+
+from django.views.generic.detail import DetailView
+from django.views.generic.edit import CreateView, DeleteView, UpdateView
+from django.views.generic.list import ListView
+
+from orchestra.contrib.musician.mixins import (CustomContextMixin, ExtendedPaginationMixin,
+ UserTokenRequiredMixin)
+
+from orchestra.contrib.webapps.models import WebApp, WebAppOption
+from orchestra.contrib.musician.tidy_forms.webapps import WebappOptionCreateForm, WebappOptionUpdateForm
+
+from orchestra.contrib.musician.settings import MUSICIAN_EDIT_ENABLE_PHP_OPTIONS
+
+
+
+
+class WebappListView(CustomContextMixin, UserTokenRequiredMixin, ListView):
+ model = WebApp
+ template_name = "musician/webapps/webapp_list.html"
+ extra_context = {
+ # Translators: This message appears on the page title
+ 'title': _('Webapps'),
+ }
+
+ def get_queryset(self):
+ return self.model.objects.filter(account=self.request.user)
+
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ context.update({
+ 'description': _("A web app is the directory where your website is stored. Through SFTP, you can access this directory and upload/edit/delete files."),
+ 'description2': _("Each Webapp has its own SFTP user, which is created automatically when the Webapp is created.")
+ })
+ return context
+
+
+class WebappDetailView(CustomContextMixin, UserTokenRequiredMixin, DetailView):
+ template_name = "musician/webapps/webapp_detail.html"
+ extra_context = {
+ # Translators: This message appears on the page title
+ 'title': _('webapp details'),
+ }
+
+ def get_queryset(self):
+ return WebApp.objects.filter(account=self.request.user)
+
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ context.update({
+ 'edit_allowed_PHP_options': MUSICIAN_EDIT_ENABLE_PHP_OPTIONS
+ })
+ return context
+
+
+class WebappAddOptionView(CustomContextMixin, UserTokenRequiredMixin, CreateView):
+ model = WebAppOption
+ form_class = WebappOptionCreateForm
+ template_name = "musician/webapps/webapp_option_form.html"
+
+ def get_form_kwargs(self):
+ kwargs = super().get_form_kwargs()
+ webapp = get_object_or_404(WebApp, account=self.request.user, pk=self.kwargs["pk"])
+ kwargs['webapp'] = webapp
+ return kwargs
+
+ def get_success_url(self):
+ return reverse_lazy("musician:webapp-detail", kwargs={"pk": self.kwargs["pk"]})
+
+class WebappDeleteOptionView(CustomContextMixin, UserTokenRequiredMixin, DeleteView):
+ model = WebAppOption
+ template_name = "musician/webapps/webappoption_check_delete.html"
+ pk_url_kwarg = "option_pk"
+
+ def get_queryset(self):
+ qs = WebAppOption.objects.filter(webapp__account=self.request.user, webapp=self.kwargs["pk"])
+ return qs
+
+ def get_success_url(self):
+ return reverse_lazy("musician:webapp-detail", kwargs={"pk": self.kwargs["pk"]})
+
+ def delete(self, request, *args, **kwargs):
+ object = self.get_object()
+ response = super().delete(request, *args, **kwargs)
+ object.webapp.save()
+ return response
+
+
+class WebappUpdateOptionView(CustomContextMixin, UserTokenRequiredMixin, UpdateView):
+ model = WebAppOption
+ form_class = WebappOptionUpdateForm
+ template_name = "musician/webapps/webapp_option_form.html"
+ pk_url_kwarg = "option_pk"
+
+ def get_queryset(self):
+ qs = WebAppOption.objects.filter(webapp__account=self.request.user, webapp=self.kwargs["pk"])
+ return qs
+
+ def get_success_url(self):
+ return reverse_lazy("musician:webapp-detail", kwargs={"pk": self.kwargs["pk"]})
diff --git a/orchestra/contrib/musician/tidy_views/websites.py b/orchestra/contrib/musician/tidy_views/websites.py
new file mode 100644
index 00000000..e0de6e0b
--- /dev/null
+++ b/orchestra/contrib/musician/tidy_views/websites.py
@@ -0,0 +1,124 @@
+from django.utils.translation import gettext_lazy as _
+from django.shortcuts import get_object_or_404
+from django.urls import reverse_lazy
+
+from django.views.generic.base import RedirectView, TemplateView
+from django.views.generic.detail import DetailView
+from django.views.generic.edit import (CreateView, DeleteView, FormView,
+ UpdateView)
+from django.views.generic.list import ListView
+
+from orchestra.contrib.musician.mixins import (CustomContextMixin, ExtendedPaginationMixin,
+ UserTokenRequiredMixin)
+
+from orchestra.contrib.websites.models import Website, Content, WebsiteDirective
+from orchestra.contrib.musician.tidy_forms.websites import WebsiteUpdateForm, WesiteContentCreateForm
+
+
+class WebsiteListView(CustomContextMixin, UserTokenRequiredMixin, ListView):
+ model = Website
+ template_name = "musician/websites/website_list.html"
+ extra_context = {
+ # Translators: This message appears on the page title
+ 'title': _('Websites'),
+ }
+
+ def get_queryset(self):
+ return self.model.objects.filter(account=self.request.user)
+
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ context.update({
+ 'description': _("A website is the place where a domain is associated with the directory where the web files are located. (WebApp)"),
+ })
+ return context
+
+
+class WebsiteDetailView(CustomContextMixin, UserTokenRequiredMixin, DetailView):
+ template_name = "musician/websites/website_detail.html"
+ extra_context = {
+ # Translators: This message appears on the page title
+ 'title': _('website details'),
+ }
+
+ def get_queryset(self):
+ return Website.objects.filter(account=self.request.user)
+
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ context['content'] = Content.objects.filter(website=self.object)
+ context['directives'] = WebsiteDirective.objects.filter(website=self.object)
+ return context
+
+
+class WebsiteUpdateView(CustomContextMixin, UserTokenRequiredMixin, UpdateView):
+ model = Website
+ form_class = WebsiteUpdateForm
+ template_name = "musician/websites/website_form.html"
+
+ def get_queryset(self):
+ qs = Website.objects.filter(account=self.request.user)
+ return qs
+
+ def get_success_url(self):
+ return reverse_lazy("musician:website-detail", kwargs={"pk": self.kwargs["pk"]})
+
+ def get_form_kwargs(self):
+ kwargs = super().get_form_kwargs()
+ kwargs["user"] = self.request.user
+ return kwargs
+
+
+class WebsiteDeleteContentView(CustomContextMixin, UserTokenRequiredMixin, DeleteView):
+ model = Content
+ template_name = "musician/websites/websiteoption_check_delete.html"
+ pk_url_kwarg = "content_pk"
+
+ def get_queryset(self):
+ qs = Content.objects.filter(website__account=self.request.user, website=self.kwargs["pk"])
+ return qs
+
+ def get_success_url(self):
+ return reverse_lazy("musician:website-detail", kwargs={"pk": self.kwargs["pk"]})
+
+ def delete(self, request, *args, **kwargs):
+ object = self.get_object()
+ response = super().delete(request, *args, **kwargs)
+ object.website.save()
+ return response
+
+
+class WebsiteDeleteDirectiveView(CustomContextMixin, UserTokenRequiredMixin, DeleteView):
+ model = WebsiteDirective
+ template_name = "musician/websites/websiteoption_check_delete.html"
+ pk_url_kwarg = "directive_pk"
+
+ def get_queryset(self):
+ qs = WebsiteDirective.objects.filter(website__account=self.request.user, website=self.kwargs["pk"])
+ return qs
+
+ def get_success_url(self):
+ return reverse_lazy("musician:website-detail", kwargs={"pk": self.kwargs["pk"]})
+
+ def delete(self, request, *args, **kwargs):
+ object = self.get_object()
+ response = super().delete(request, *args, **kwargs)
+ object.website.save()
+ return response
+
+
+class WebsiteAddContentView(CustomContextMixin, UserTokenRequiredMixin, CreateView):
+ model = Content
+ form_class = WesiteContentCreateForm
+ template_name = "musician/websites/website_create_option_form.html"
+
+ def get_form_kwargs(self):
+ kwargs = super().get_form_kwargs()
+ website = get_object_or_404(Website, account=self.request.user, pk=self.kwargs["pk"])
+ kwargs['website'] = website
+ kwargs["user"] = self.request.user
+ return kwargs
+
+ def get_success_url(self):
+ return reverse_lazy("musician:website-detail", kwargs={"pk": self.kwargs["pk"]})
+
\ No newline at end of file
diff --git a/orchestra/contrib/musician/urls.py b/orchestra/contrib/musician/urls.py
index 2604b715..75950373 100644
--- a/orchestra/contrib/musician/urls.py
+++ b/orchestra/contrib/musician/urls.py
@@ -48,6 +48,7 @@ urlpatterns = [
path('websites/', views.WebsiteListView.as_view(), name='website-list'),
path('websites//', views.WebsiteDetailView.as_view(), name='website-detail'),
path('websites//edit/', views.WebsiteUpdateView.as_view(), name='website-update'),
+ path('websites//add-content/', views.WebsiteAddContentView.as_view(), name='website-add-content'),
path('websites//content//delete/', views.WebsiteDeleteContentView.as_view(), name='website-delete-content'),
path('websites//directive//delete/', views.WebsiteDeleteDirectiveView.as_view(), name='website-delete-directive'),
diff --git a/orchestra/contrib/musician/views.py b/orchestra/contrib/musician/views.py
index 91af6083..6a7f0e0f 100644
--- a/orchestra/contrib/musician/views.py
+++ b/orchestra/contrib/musician/views.py
@@ -33,16 +33,13 @@ from orchestra.contrib.mailboxes.models import Address, Mailbox
from orchestra.contrib.resources.models import Resource, ResourceData
from orchestra.contrib.saas.models import SaaS
from orchestra.contrib.systemusers.models import WebappUsers, SystemUser
-from orchestra.contrib.websites.models import Website, Content, WebsiteDirective
-from orchestra.contrib.webapps.models import WebApp, WebAppOption
from orchestra.utils.html import html_to_pdf
from .auth import logout as auth_logout
from .forms import (LoginForm, MailboxChangePasswordForm, MailboxCreateForm,
MailboxSearchForm, MailboxUpdateForm, MailForm,
RecordCreateForm, RecordUpdateForm, WebappUsersChangePasswordForm,
- SystemUsersChangePasswordForm, WebappOptionCreateForm, WebappOptionUpdateForm,
- WebsiteUpdateForm)
+ SystemUsersChangePasswordForm)
from .mixins import (CustomContextMixin, ExtendedPaginationMixin,
UserTokenRequiredMixin)
from .models import Address as AddressService
@@ -53,6 +50,9 @@ from .models import MailinglistService, SaasService
from .settings import ALLOWED_RESOURCES, MUSICIAN_EDIT_ENABLE_PHP_OPTIONS
from .utils import get_bootstraped_percent
+from .tidy_views.webapps import *
+from .tidy_views.websites import *
+
logger = logging.getLogger(__name__)
@@ -621,14 +621,14 @@ class LogoutView(RedirectView):
class WebappUserListView(ServiceListView):
model = WebappUsers
- template_name = "musician/webappuser_list.html"
+ template_name = "musician/webapps/webappuser_list.html"
extra_context = {
# Translators: This message appears on the page title
'title': _('Webapp users'),
}
class WebappUserChangePasswordView(CustomContextMixin, UserTokenRequiredMixin, UpdateView):
- template_name = "musician/webappuser_change_password.html"
+ template_name = "musician/webapps/webappuser_change_password.html"
model = WebappUsers
form_class = WebappUsersChangePasswordForm
success_url = reverse_lazy("musician:webappuser-list")
@@ -654,178 +654,3 @@ class SystemUserChangePasswordView(CustomContextMixin, UserTokenRequiredMixin, U
def get_queryset(self):
return self.model.objects.filter(account=self.request.user)
-class WebsiteListView(CustomContextMixin, UserTokenRequiredMixin, ListView):
- model = Website
- template_name = "musician/website_list.html"
- extra_context = {
- # Translators: This message appears on the page title
- 'title': _('Websites'),
- }
-
- def get_queryset(self):
- return self.model.objects.filter(account=self.request.user)
-
- def get_context_data(self, **kwargs):
- context = super().get_context_data(**kwargs)
- context.update({
- 'description': _("A website is the place where a domain is associated with the directory where the web files are located. (WebApp)"),
- })
- return context
-
-
-class WebsiteDetailView(CustomContextMixin, UserTokenRequiredMixin, DetailView):
- template_name = "musician/website_detail.html"
- extra_context = {
- # Translators: This message appears on the page title
- 'title': _('website details'),
- }
-
- def get_queryset(self):
- return Website.objects.filter(account=self.request.user)
-
- def get_context_data(self, **kwargs):
- context = super().get_context_data(**kwargs)
- context['content'] = Content.objects.filter(website=self.object)
- context['directives'] = WebsiteDirective.objects.filter(website=self.object)
- return context
-
-
-class WebsiteUpdateView(CustomContextMixin, UserTokenRequiredMixin, UpdateView):
- model = Website
- form_class = WebsiteUpdateForm
- template_name = "musician/website_form.html"
-
- def get_queryset(self):
- qs = Website.objects.filter(account=self.request.user)
- return qs
-
- def get_success_url(self):
- return reverse_lazy("musician:website-detail", kwargs={"pk": self.kwargs["pk"]})
-
- def get_form_kwargs(self):
- kwargs = super().get_form_kwargs()
- kwargs["user"] = self.request.user
- return kwargs
-
-
-class WebsiteDeleteContentView(CustomContextMixin, UserTokenRequiredMixin, DeleteView):
- model = Content
- template_name = "musician/websiteoption_check_delete.html"
- pk_url_kwarg = "content_pk"
-
- def get_queryset(self):
- qs = Content.objects.filter(website__account=self.request.user, website=self.kwargs["pk"])
- return qs
-
- def get_success_url(self):
- return reverse_lazy("musician:website-detail", kwargs={"pk": self.kwargs["pk"]})
-
- def delete(self, request, *args, **kwargs):
- object = self.get_object()
- response = super().delete(request, *args, **kwargs)
- object.website.save()
- return response
-
-
-class WebsiteDeleteDirectiveView(CustomContextMixin, UserTokenRequiredMixin, DeleteView):
- model = WebsiteDirective
- template_name = "musician/websiteoption_check_delete.html"
- pk_url_kwarg = "directive_pk"
-
- def get_queryset(self):
- qs = WebsiteDirective.objects.filter(website__account=self.request.user, website=self.kwargs["pk"])
- return qs
-
- def get_success_url(self):
- return reverse_lazy("musician:website-detail", kwargs={"pk": self.kwargs["pk"]})
-
- def delete(self, request, *args, **kwargs):
- object = self.get_object()
- response = super().delete(request, *args, **kwargs)
- object.website.save()
- return response
-
-
-class WebappListView(CustomContextMixin, UserTokenRequiredMixin, ListView):
- model = WebApp
- template_name = "musician/webapp_list.html"
- extra_context = {
- # Translators: This message appears on the page title
- 'title': _('Webapps'),
- }
-
- def get_queryset(self):
- return self.model.objects.filter(account=self.request.user)
-
- def get_context_data(self, **kwargs):
- context = super().get_context_data(**kwargs)
- context.update({
- 'description': _("A web app is the directory where your website is stored. Through SFTP, you can access this directory and upload/edit/delete files."),
- 'description2': _("Each Webapp has its own SFTP user, which is created automatically when the Webapp is created.")
- })
- return context
-
-
-class WebappDetailView(CustomContextMixin, UserTokenRequiredMixin, DetailView):
- template_name = "musician/webapp_detail.html"
- extra_context = {
- # Translators: This message appears on the page title
- 'title': _('webapp details'),
- }
-
- def get_queryset(self):
- return WebApp.objects.filter(account=self.request.user)
-
- def get_context_data(self, **kwargs):
- context = super().get_context_data(**kwargs)
- context.update({
- 'edit_allowed_PHP_options': MUSICIAN_EDIT_ENABLE_PHP_OPTIONS
- })
- return context
-
-
-class WebappAddOptionView(CustomContextMixin, UserTokenRequiredMixin, CreateView):
- model = WebAppOption
- form_class = WebappOptionCreateForm
- template_name = "musician/webapp_option_form.html"
-
- def get_form_kwargs(self):
- kwargs = super().get_form_kwargs()
- webapp = get_object_or_404(WebApp, account=self.request.user, pk=self.kwargs["pk"])
- kwargs['webapp'] = webapp
- return kwargs
-
- def get_success_url(self):
- return reverse_lazy("musician:webapp-detail", kwargs={"pk": self.kwargs["pk"]})
-
-class WebappDeleteOptionView(CustomContextMixin, UserTokenRequiredMixin, DeleteView):
- model = WebAppOption
- template_name = "musician/webappoption_check_delete.html"
- pk_url_kwarg = "option_pk"
-
- def get_queryset(self):
- qs = WebAppOption.objects.filter(webapp__account=self.request.user, webapp=self.kwargs["pk"])
- return qs
-
- def get_success_url(self):
- return reverse_lazy("musician:webapp-detail", kwargs={"pk": self.kwargs["pk"]})
-
- def delete(self, request, *args, **kwargs):
- object = self.get_object()
- response = super().delete(request, *args, **kwargs)
- object.webapp.save()
- return response
-
-
-class WebappUpdateOptionView(CustomContextMixin, UserTokenRequiredMixin, UpdateView):
- model = WebAppOption
- form_class = WebappOptionUpdateForm
- template_name = "musician/webapp_option_form.html"
- pk_url_kwarg = "option_pk"
-
- def get_queryset(self):
- qs = WebAppOption.objects.filter(webapp__account=self.request.user, webapp=self.kwargs["pk"])
- return qs
-
- def get_success_url(self):
- return reverse_lazy("musician:webapp-detail", kwargs={"pk": self.kwargs["pk"]})