From 6759ff4b580d75400c54a0a026a21611fa129d2b Mon Sep 17 00:00:00 2001 From: Kristofers Solo Date: Wed, 28 Jun 2023 02:27:46 +0000 Subject: [PATCH] Some changes --- .gitignore | 2 + .../apps/account/migrations/0001_initial.py | 6 +- .../migrations/0002_customuser_profile_pic.py | 18 ---- .../0003_alter_customuser_profile_pic.py | 18 ---- .../0004_alter_customuser_profile_pic.py | 18 ---- ..._profile_pic_customuser_profile_picture.py | 18 ---- .../0006_alter_customuser_profile_picture.py | 18 ---- .../0007_alter_customuser_profile_picture.py | 20 ---- .../migrations/0008_rename_customuser_user.py | 20 ---- .../migrations/0009_rename_user_customuser.py | 20 ---- .../migrations/0010_rename_customuser_user.py | 20 ---- FOSSDB/apps/account/models.py | 2 +- FOSSDB/apps/fossdb/admin.py | 5 +- FOSSDB/apps/fossdb/filters.py | 28 +++++ FOSSDB/apps/fossdb/hosting_platform/forms.py | 2 +- FOSSDB/apps/fossdb/migrations/0001_initial.py | 12 ++- .../fossdb/migrations/0002_alter_tag_icon.py | 18 ++++ ...r_projectprogramminglanguage_percentage.py | 18 ++++ FOSSDB/apps/fossdb/models.py | 17 ++- FOSSDB/apps/fossdb/operating_system/models.py | 11 ++ .../fossdb/programming_language/models.py | 2 +- FOSSDB/apps/fossdb/urls.py | 4 +- FOSSDB/apps/fossdb/views.py | 101 +++++++++--------- FOSSDB/settings.py | 1 + FOSSDB/urls.py | 7 +- templates/fossdb/add_project.html | 14 --- templates/fossdb/create_view.html | 34 ++++++ templates/fossdb/detailed_view.html | 1 - templates/fossdb/index.html | 14 ++- templates/fossdb/update_view.html | 12 --- 30 files changed, 213 insertions(+), 268 deletions(-) delete mode 100644 FOSSDB/apps/account/migrations/0002_customuser_profile_pic.py delete mode 100644 FOSSDB/apps/account/migrations/0003_alter_customuser_profile_pic.py delete mode 100644 FOSSDB/apps/account/migrations/0004_alter_customuser_profile_pic.py delete mode 100644 FOSSDB/apps/account/migrations/0005_rename_profile_pic_customuser_profile_picture.py delete mode 100644 FOSSDB/apps/account/migrations/0006_alter_customuser_profile_picture.py delete mode 100644 FOSSDB/apps/account/migrations/0007_alter_customuser_profile_picture.py delete mode 100644 FOSSDB/apps/account/migrations/0008_rename_customuser_user.py delete mode 100644 FOSSDB/apps/account/migrations/0009_rename_user_customuser.py delete mode 100644 FOSSDB/apps/account/migrations/0010_rename_customuser_user.py create mode 100644 FOSSDB/apps/fossdb/filters.py create mode 100644 FOSSDB/apps/fossdb/migrations/0002_alter_tag_icon.py create mode 100644 FOSSDB/apps/fossdb/migrations/0003_alter_projectprogramminglanguage_percentage.py delete mode 100644 templates/fossdb/add_project.html create mode 100644 templates/fossdb/create_view.html delete mode 100644 templates/fossdb/update_view.html diff --git a/.gitignore b/.gitignore index 370e58e..a4081bc 100644 --- a/.gitignore +++ b/.gitignore @@ -135,3 +135,5 @@ debug /static/admin/ /static/fontawesomefree/ config.json +/media/profile_pics/* +!/media/profile_pics/default.jpg diff --git a/FOSSDB/apps/account/migrations/0001_initial.py b/FOSSDB/apps/account/migrations/0001_initial.py index 5fd38f4..5b6cc36 100644 --- a/FOSSDB/apps/account/migrations/0001_initial.py +++ b/FOSSDB/apps/account/migrations/0001_initial.py @@ -1,5 +1,6 @@ -# Generated by Django 4.2.2 on 2023-06-27 12:54 +# Generated by Django 4.2.2 on 2023-06-27 16:35 +import account.models import django.contrib.auth.models import django.contrib.auth.validators from django.db import migrations, models @@ -17,7 +18,7 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name='CustomUser', + name='User', fields=[ ('password', models.CharField(max_length=128, verbose_name='password')), ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), @@ -30,6 +31,7 @@ class Migration(migrations.Migration): ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, verbose_name='ID')), + ('profile_picture', models.ImageField(default='profile_pics/default.jpg', upload_to=account.models.get_profile_pic_path)), ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), ], diff --git a/FOSSDB/apps/account/migrations/0002_customuser_profile_pic.py b/FOSSDB/apps/account/migrations/0002_customuser_profile_pic.py deleted file mode 100644 index 63126a7..0000000 --- a/FOSSDB/apps/account/migrations/0002_customuser_profile_pic.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.2 on 2023-06-27 13:02 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='customuser', - name='profile_pic', - field=models.ImageField(default='default.jpg', upload_to='profile_pics/'), - ), - ] diff --git a/FOSSDB/apps/account/migrations/0003_alter_customuser_profile_pic.py b/FOSSDB/apps/account/migrations/0003_alter_customuser_profile_pic.py deleted file mode 100644 index 10db396..0000000 --- a/FOSSDB/apps/account/migrations/0003_alter_customuser_profile_pic.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.2 on 2023-06-27 13:28 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0002_customuser_profile_pic'), - ] - - operations = [ - migrations.AlterField( - model_name='customuser', - name='profile_pic', - field=models.BinaryField(blank=True), - ), - ] diff --git a/FOSSDB/apps/account/migrations/0004_alter_customuser_profile_pic.py b/FOSSDB/apps/account/migrations/0004_alter_customuser_profile_pic.py deleted file mode 100644 index 1b2c597..0000000 --- a/FOSSDB/apps/account/migrations/0004_alter_customuser_profile_pic.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.2 on 2023-06-27 13:32 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0003_alter_customuser_profile_pic'), - ] - - operations = [ - migrations.AlterField( - model_name='customuser', - name='profile_pic', - field=models.BinaryField(blank=True, editable=True), - ), - ] diff --git a/FOSSDB/apps/account/migrations/0005_rename_profile_pic_customuser_profile_picture.py b/FOSSDB/apps/account/migrations/0005_rename_profile_pic_customuser_profile_picture.py deleted file mode 100644 index 1dee064..0000000 --- a/FOSSDB/apps/account/migrations/0005_rename_profile_pic_customuser_profile_picture.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.2 on 2023-06-27 13:33 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0004_alter_customuser_profile_pic'), - ] - - operations = [ - migrations.RenameField( - model_name='customuser', - old_name='profile_pic', - new_name='profile_picture', - ), - ] diff --git a/FOSSDB/apps/account/migrations/0006_alter_customuser_profile_picture.py b/FOSSDB/apps/account/migrations/0006_alter_customuser_profile_picture.py deleted file mode 100644 index 1b959e4..0000000 --- a/FOSSDB/apps/account/migrations/0006_alter_customuser_profile_picture.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.2 on 2023-06-27 13:34 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0005_rename_profile_pic_customuser_profile_picture'), - ] - - operations = [ - migrations.AlterField( - model_name='customuser', - name='profile_picture', - field=models.ImageField(default='profile_pic/default.jpg', upload_to='profile_pics/'), - ), - ] diff --git a/FOSSDB/apps/account/migrations/0007_alter_customuser_profile_picture.py b/FOSSDB/apps/account/migrations/0007_alter_customuser_profile_picture.py deleted file mode 100644 index 48f53d8..0000000 --- a/FOSSDB/apps/account/migrations/0007_alter_customuser_profile_picture.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 4.2.2 on 2023-06-27 13:43 - -import account.models -from django.db import migrations, models -import pathlib - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0006_alter_customuser_profile_picture'), - ] - - operations = [ - migrations.AlterField( - model_name='customuser', - name='profile_picture', - field=models.ImageField(default=pathlib.PurePosixPath('profile_pic/default.jpg'), upload_to=account.models.get_profile_pic_path), - ), - ] diff --git a/FOSSDB/apps/account/migrations/0008_rename_customuser_user.py b/FOSSDB/apps/account/migrations/0008_rename_customuser_user.py deleted file mode 100644 index 25c325b..0000000 --- a/FOSSDB/apps/account/migrations/0008_rename_customuser_user.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 4.2.2 on 2023-06-27 13:51 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('fossdb', '0001_initial'), - ('auth', '0012_alter_user_first_name_max_length'), - ('admin', '0003_logentry_add_action_flag_choices'), - ('account', '0007_alter_customuser_profile_picture'), - ] - - operations = [ - migrations.RenameModel( - old_name='CustomUser', - new_name='User', - ), - ] diff --git a/FOSSDB/apps/account/migrations/0009_rename_user_customuser.py b/FOSSDB/apps/account/migrations/0009_rename_user_customuser.py deleted file mode 100644 index e853ebd..0000000 --- a/FOSSDB/apps/account/migrations/0009_rename_user_customuser.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 4.2.2 on 2023-06-27 13:53 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('fossdb', '0001_initial'), - ('auth', '0012_alter_user_first_name_max_length'), - ('admin', '0003_logentry_add_action_flag_choices'), - ('account', '0008_rename_customuser_user'), - ] - - operations = [ - migrations.RenameModel( - old_name='User', - new_name='CustomUser', - ), - ] diff --git a/FOSSDB/apps/account/migrations/0010_rename_customuser_user.py b/FOSSDB/apps/account/migrations/0010_rename_customuser_user.py deleted file mode 100644 index 31d690b..0000000 --- a/FOSSDB/apps/account/migrations/0010_rename_customuser_user.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 4.2.2 on 2023-06-27 13:55 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('admin', '0003_logentry_add_action_flag_choices'), - ('auth', '0012_alter_user_first_name_max_length'), - ('fossdb', '0001_initial'), - ('account', '0009_rename_user_customuser'), - ] - - operations = [ - migrations.RenameModel( - old_name='CustomUser', - new_name='User', - ), - ] diff --git a/FOSSDB/apps/account/models.py b/FOSSDB/apps/account/models.py index 46ed42e..a4164e6 100644 --- a/FOSSDB/apps/account/models.py +++ b/FOSSDB/apps/account/models.py @@ -14,7 +14,7 @@ def get_profile_pic_path(instance, filename) -> Path: class User(AbstractUser): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, verbose_name="ID") - profile_picture = models.ImageField(upload_to=get_profile_pic_path, default=Path("profile_pics", "default.jpg")) + profile_picture = models.ImageField(upload_to=get_profile_pic_path, default="profile_pics/default.jpg") @property def full_name(self): diff --git a/FOSSDB/apps/fossdb/admin.py b/FOSSDB/apps/fossdb/admin.py index ed62fd0..9fd82e2 100644 --- a/FOSSDB/apps/fossdb/admin.py +++ b/FOSSDB/apps/fossdb/admin.py @@ -20,7 +20,10 @@ class ProjectHostingPlatformInline(admin.TabularInline): class ProjectAdmin(admin.ModelAdmin): inlines = [ProjectHostingPlatformInline, ProjectProgrammingLanguageInline] - list_display = ("name", "owner", "_languages") + list_display = ( + "name", + "owner", + ) def _languages(self, object): return " | ".join([i.programming_language.name for i in object.projectprogramminglanguage_set.all()]) diff --git a/FOSSDB/apps/fossdb/filters.py b/FOSSDB/apps/fossdb/filters.py new file mode 100644 index 0000000..cc81ca6 --- /dev/null +++ b/FOSSDB/apps/fossdb/filters.py @@ -0,0 +1,28 @@ +import django_filters +from django.contrib.auth import get_user_model + +from .models import Project + +User = get_user_model() + + +class UserFilter(django_filters.FilterSet): + username = django_filters.CharFilter(lookup_expr="icontains") + + class Meta: + model = User + fields = ("username",) + + +class ProjectFilter(django_filters.FilterSet): + owner = UserFilter() + name = django_filters.CharFilter(lookup_expr="icontains") + description = django_filters.CharFilter(lookup_expr="icontains") + + class Meta: + model = Project + fields = ( + "owner", + "name", + "description", + ) diff --git a/FOSSDB/apps/fossdb/hosting_platform/forms.py b/FOSSDB/apps/fossdb/hosting_platform/forms.py index f4ab0f0..2f69d24 100644 --- a/FOSSDB/apps/fossdb/hosting_platform/forms.py +++ b/FOSSDB/apps/fossdb/hosting_platform/forms.py @@ -1,6 +1,6 @@ from django import forms -from .models import ProjectHostingPlatform, HostingPlatform +from .models import HostingPlatform, ProjectHostingPlatform class HostingPlatformForm(forms.ModelForm): diff --git a/FOSSDB/apps/fossdb/migrations/0001_initial.py b/FOSSDB/apps/fossdb/migrations/0001_initial.py index fc86c22..b947c0a 100644 --- a/FOSSDB/apps/fossdb/migrations/0001_initial.py +++ b/FOSSDB/apps/fossdb/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.2.2 on 2023-06-27 12:54 +# Generated by Django 4.2.2 on 2023-06-27 16:35 from django.conf import settings from django.db import migrations, models @@ -75,7 +75,7 @@ class Migration(migrations.Migration): ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(db_index=True, max_length=100, unique=True)), ('description', models.TextField(blank=True, default='')), - ('icon', models.ImageField(blank=True, null=True, upload_to='types/icons/')), + ('icon', models.ImageField(blank=True, upload_to='types/icons/')), ], ), migrations.CreateModel( @@ -106,4 +106,12 @@ class Migration(migrations.Migration): name='tag', field=models.ManyToManyField(blank=True, to='fossdb.tag'), ), + migrations.AddConstraint( + model_name='project', + constraint=models.UniqueConstraint(fields=('owner', 'name'), name='unique_owner_name'), + ), + migrations.AddConstraint( + model_name='operatingsystemversion', + constraint=models.UniqueConstraint(fields=('operating_system', 'version'), name='unique_os_version'), + ), ] diff --git a/FOSSDB/apps/fossdb/migrations/0002_alter_tag_icon.py b/FOSSDB/apps/fossdb/migrations/0002_alter_tag_icon.py new file mode 100644 index 0000000..5992142 --- /dev/null +++ b/FOSSDB/apps/fossdb/migrations/0002_alter_tag_icon.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.2 on 2023-06-27 16:36 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('fossdb', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='tag', + name='icon', + field=models.ImageField(blank=True, null=True, upload_to='types/icons/'), + ), + ] diff --git a/FOSSDB/apps/fossdb/migrations/0003_alter_projectprogramminglanguage_percentage.py b/FOSSDB/apps/fossdb/migrations/0003_alter_projectprogramminglanguage_percentage.py new file mode 100644 index 0000000..c5403b8 --- /dev/null +++ b/FOSSDB/apps/fossdb/migrations/0003_alter_projectprogramminglanguage_percentage.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.2 on 2023-06-27 18:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('fossdb', '0002_alter_tag_icon'), + ] + + operations = [ + migrations.AlterField( + model_name='projectprogramminglanguage', + name='percentage', + field=models.PositiveIntegerField(blank=True, null=True), + ), + ] diff --git a/FOSSDB/apps/fossdb/models.py b/FOSSDB/apps/fossdb/models.py index 5e0f71e..fef774f 100644 --- a/FOSSDB/apps/fossdb/models.py +++ b/FOSSDB/apps/fossdb/models.py @@ -6,7 +6,7 @@ from django.db import models from .license.models import License from .operating_system.models import OperatingSystemVersion -from .programming_language.models import ProgrammingLanguage, ProjectProgrammingLanguage +from .programming_language.models import ProgrammingLanguage from .tag.models import Tag @@ -18,7 +18,7 @@ class Project(models.Model): license = models.ManyToManyField(License, blank=True) tag = models.ManyToManyField(Tag, blank=True) operating_system = models.ManyToManyField(OperatingSystemVersion, blank=True) - programming_language = models.ManyToManyField(ProgrammingLanguage, through=ProjectProgrammingLanguage, blank=True) + programming_language = models.ManyToManyField(ProgrammingLanguage, through="ProjectProgrammingLanguage", blank=True) date_created = models.DateTimeField(auto_now_add=True) @property @@ -29,4 +29,15 @@ class Project(models.Model): return f"/{self.owner}/{self.name}" def __str__(self): - return f"{self.owner} | {self.name}" + return f"{self.owner}/{self.name}" + + class Meta: + constraints = ( + models.UniqueConstraint( + fields=( + "owner", + "name", + ), + name="unique_owner_name", + ), + ) diff --git a/FOSSDB/apps/fossdb/operating_system/models.py b/FOSSDB/apps/fossdb/operating_system/models.py index 24cc7ca..911d8fd 100644 --- a/FOSSDB/apps/fossdb/operating_system/models.py +++ b/FOSSDB/apps/fossdb/operating_system/models.py @@ -17,3 +17,14 @@ class OperatingSystemVersion(models.Model): def __str__(self): return f"{self.operating_system.name} {self.version} {'LTS' if self.is_lts else ''}" + + class Meta: + constraints = ( + models.UniqueConstraint( + fields=( + "operating_system", + "version", + ), + name="unique_os_version", + ), + ) diff --git a/FOSSDB/apps/fossdb/programming_language/models.py b/FOSSDB/apps/fossdb/programming_language/models.py index 853b793..d2357d3 100644 --- a/FOSSDB/apps/fossdb/programming_language/models.py +++ b/FOSSDB/apps/fossdb/programming_language/models.py @@ -11,7 +11,7 @@ class ProgrammingLanguage(models.Model): class ProjectProgrammingLanguage(models.Model): project = models.ForeignKey("Project", on_delete=models.CASCADE) programming_language = models.ForeignKey(ProgrammingLanguage, on_delete=models.CASCADE) - percentage = models.PositiveIntegerField() + percentage = models.PositiveIntegerField(blank=True, null=True) def __str__(self): return f"{self.project.owner}/{self.project.name} | {self.programming_language} | {self.percentage}%" diff --git a/FOSSDB/apps/fossdb/urls.py b/FOSSDB/apps/fossdb/urls.py index e2bb536..a831e57 100644 --- a/FOSSDB/apps/fossdb/urls.py +++ b/FOSSDB/apps/fossdb/urls.py @@ -3,9 +3,9 @@ from django.urls import path from . import views urlpatterns = [ - path("", views.index, name="index"), + path("", views.ProjectListView.as_view(), name="index"), path("add/", views.ProjectCreateView.as_view(), name="add-project"), path("//", views.ProjectDetailView.as_view(), name="project-detail"), - path("//update/", views.ProjectUpdateView.as_view(), name="project-update"), + path("//edit/", views.ProjectUpdateView.as_view(), name="project-update"), path("//delete/", views.ProjectDeleteView.as_view(), name="project-delete"), ] diff --git a/FOSSDB/apps/fossdb/views.py b/FOSSDB/apps/fossdb/views.py index abd7b23..71668a5 100644 --- a/FOSSDB/apps/fossdb/views.py +++ b/FOSSDB/apps/fossdb/views.py @@ -1,58 +1,67 @@ from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin -from django.db import transaction -from django.shortcuts import get_object_or_404, redirect, render +from django.forms import inlineformset_factory +from django.shortcuts import redirect from django.views.generic import CreateView, DeleteView, DetailView, UpdateView +from django_filters.views import FilterView + +from .filters import ProjectFilter + from .forms import ProjectForm from .hosting_platform.forms import HostingPlatformForm - from .models import Project from .programming_language.forms import ProgrammingLanguageForm +from .programming_language.models import ProjectProgrammingLanguage + +ProgrammingLanguageInlineFormset = inlineformset_factory( + Project, + ProjectProgrammingLanguage, + form=ProgrammingLanguageForm, + extra=1, +) -def index(request): - context = { - "title": "FOSSDB", - "projects": Project.objects.all(), - } - return render(request, "fossdb/index.html", context) +class ProjectListView(FilterView): + model = Project + template_name = "fossdb/index.html" + filterset_class = ProjectFilter + context_object_name = "projects" + paginate_by = 10 # optional 10 projects a page class ProjectCreateView(LoginRequiredMixin, CreateView): model = Project form_class = ProjectForm - template_name = "fossdb/add_project.html" + template_name = "fossdb/create_view.html" login_url = "/login/" redirect_field_name = "redirect_to" - def form_valid(self, form): - response = None - with transaction.atomic(): - form.instance.owner = self.request.user - response = super().form_valid(form) - - hosting_platform_form = HostingPlatformForm(self.request.POST, instance=self.object) - if hosting_platform_form.is_valid(): - hosting_platform = hosting_platform_form.save(commit=False) - hosting_platform.project = self.object - hosting_platform.save() - - # TODO: allow adding multiple languages - programming_language_form = ProgrammingLanguageForm(self.request.POST, instance=self.object) - if programming_language_form.is_valid(): - programming_language = programming_language_form.save(commit=False) - programming_language.project = self.object - programming_language.save() - - return response - def get_context_data(self, *args, **kwargs): - context = super().get_context_data(**kwargs) - context["title"] = "Add project" - context["project_form"] = ProjectForm() - context["hosting_platform_form"] = HostingPlatformForm() - context["programming_language_form"] = ProgrammingLanguageForm() - return context + data = super().get_context_data(**kwargs) + data["hosting_platform"] = HostingPlatformForm(self.request.POST or None, prefix="hosting") + data["programming_language"] = ProgrammingLanguageInlineFormset(self.request.POST or None, prefix="language") + data["empty_form"] = ProgrammingLanguageInlineFormset(prefix="language_empty") + return data + + def form_valid(self, form): + context = self.get_context_data() + form.instance.owner = self.request.user + hosting_platform = context["hosting_platform"] + programming_language = context["programming_language"] + self.object = form.save() + if hosting_platform.is_valid(): + hosting_platform.instance.project = self.object + hosting_platform.save() + # TODO: allow adding multiple languages + if programming_language.is_valid(): + for instance in programming_language.save(commit=False): + instance.project = self.object + instance.save() + programming_language.save_m2m() + if hosting_platform.is_valid() and programming_language.is_valid(): + return super().form_valid(form) + else: + return self.render_to_response(self.get_context_data(form=form)) class ProjectDetailView(DetailView): @@ -65,7 +74,7 @@ class ProjectDetailView(DetailView): class ProjectUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView): model = Project - template_name = "fossdb/update_view.html" + template_name = "fossdb/create_view.html" form_class = ProjectForm slug_field = "name" slug_url_kwarg = "project_name" @@ -79,17 +88,11 @@ class ProjectUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView): return redirect("index") def get_context_data(self, *args, **kwargs): - context = super().get_context_data(**kwargs) - if self.request.POST: - context["project_form"] = ProjectForm(self.request.POST, instance=self.object) - context["hosting_platform_form"] = HostingPlatformForm(self.request.POST, instance=self.object) - context["programming_language_form"] = ProgrammingLanguageForm(self.request.POST, instance=self.object) - else: - context["project_form"] = ProjectForm(instance=self.object) - context["hosting_platform_form"] = HostingPlatformForm(instance=self.object) - context["programming_language_form"] = ProgrammingLanguageForm(instance=self.object) - - return context + data = super(ProjectUpdateView, self).get_context_data(**kwargs) + data["hosting_platform"] = HostingPlatformForm(self.request.POST or None, instance=self.object.projecthostingplatform, prefix="hosting") + data["programming_language"] = ProgrammingLanguageInlineFormset(self.request.POST or None, instance=self.object, prefix="language") + data["empty_form"] = ProgrammingLanguageInlineFormset(prefix="language_empty") + return data class ProjectDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView): diff --git a/FOSSDB/settings.py b/FOSSDB/settings.py index 9e80206..bc2bd4c 100644 --- a/FOSSDB/settings.py +++ b/FOSSDB/settings.py @@ -37,6 +37,7 @@ DEBUG = config["DEBUG"] INSTALLED_APPS = [ "account", "fossdb", + "django_filters", "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", diff --git a/FOSSDB/urls.py b/FOSSDB/urls.py index d5c0637..af7155c 100644 --- a/FOSSDB/urls.py +++ b/FOSSDB/urls.py @@ -19,12 +19,11 @@ from django.contrib import admin from django.urls import include, path urlpatterns = [ + path("admin/", admin.site.urls), path("", include("fossdb.urls")), path("", include("account.urls")), - # path("", include("django.contrib.auth.urls")), - path("admin/", admin.site.urls), + path("", include("django.contrib.auth.urls")), ] urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) -if settings.DEBUG: - urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) +urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/templates/fossdb/add_project.html b/templates/fossdb/add_project.html deleted file mode 100644 index b25bbd7..0000000 --- a/templates/fossdb/add_project.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends "layout.html" %} -{% load static %} -{% block title %}{{ title }}{% endblock %} -{% block meta %}{% endblock %} -{% block content %} -
- {% csrf_token %} - {{ project_form.as_p }} - {{ hosting_platform_form.as_table }} -
- {{ programming_language_form.as_table }} - -
-{% endblock %} diff --git a/templates/fossdb/create_view.html b/templates/fossdb/create_view.html new file mode 100644 index 0000000..aa624a2 --- /dev/null +++ b/templates/fossdb/create_view.html @@ -0,0 +1,34 @@ +{% extends "layout.html" %} +{% load static %} +{% block title %}{{ title }}{% endblock %} +{% block meta %}{% endblock %} +{% block content %} +
+ {% csrf_token %} + {{ form.as_p }} + {{ hosting_platform.management_form }} + {{ hosting_platform.as_table }} +
+ {{ programming_language.management_form }} + {% for form in programming_language %}
{{ form.as_table }}
{% endfor %} +
+ + + + + + +
+ +{% endblock %} diff --git a/templates/fossdb/detailed_view.html b/templates/fossdb/detailed_view.html index b3ffc73..6e26ccb 100644 --- a/templates/fossdb/detailed_view.html +++ b/templates/fossdb/detailed_view.html @@ -39,7 +39,6 @@

No language

{% endfor %} -

{{ project.date_created|date:"d.m.Y, G:i" }}

diff --git a/templates/fossdb/index.html b/templates/fossdb/index.html index c4fbc3f..93f2dbd 100644 --- a/templates/fossdb/index.html +++ b/templates/fossdb/index.html @@ -3,6 +3,7 @@ {% block title %}{{ title }}{% endblock %} {% block meta %}{% endblock %} {% block content %} +

{{ username }}

@@ -10,14 +11,17 @@ Admin
+
+ {{ filter.form.as_p }} + +
{% for project in projects %}
-

- {{ project.owner }}/{{ project.name }} -

-

{{ project.description }}

+ {{ project }}
+
{{ project.description }}
+
{% empty %} -

No projects yet (

+

No projects found

{% endfor %} {% endblock %} diff --git a/templates/fossdb/update_view.html b/templates/fossdb/update_view.html deleted file mode 100644 index 48c0d7c..0000000 --- a/templates/fossdb/update_view.html +++ /dev/null @@ -1,12 +0,0 @@ -{% extends "layout.html" %} -{% block title %}Edit {{ project.name }}{% endblock %} -{% block content %} -
- {% csrf_token %} - {{ project_form.as_p }} - {{ hosting_platform_form.as_table }} -
- {{ programming_language_form.as_table }} - -
-{% endblock %}