diff --git a/FOSSDB/apps/fossdb/admin.py b/FOSSDB/apps/fossdb/admin.py index ea74c31..951a1ee 100644 --- a/FOSSDB/apps/fossdb/admin.py +++ b/FOSSDB/apps/fossdb/admin.py @@ -1,9 +1,10 @@ from django.contrib import admin -from .host.models import HostingPlatform, ProjectHostingPlatform -from .language.models import ProgrammingLanguage, ProjectProgrammingLanguage +from .hosting_platform.models import HostingPlatform, ProjectHostingPlatform from .license.models import License from .models import Project +from .operating_system.models import OperatingSystem, OperatingSystemVersion +from .programming_language.models import ProgrammingLanguage, ProjectProgrammingLanguage from .tag.models import Tag @@ -12,24 +13,26 @@ class ProjectProgrammingLanguageInline(admin.TabularInline): extra = 1 -class ProjectHostingPlatformInline(admin.TabularInline): - model = ProjectHostingPlatform - extra = 1 - - class ProjectAdmin(admin.ModelAdmin): - inlines = [ProjectProgrammingLanguageInline, ProjectHostingPlatformInline] - list_display = ("author", "name", "_languages", "_hosting_platform") + inlines = [ProjectProgrammingLanguageInline] + list_display = ("name", "author", "_languages", "hosting_platform") def _languages(self, object): - return " | ".join([i.language.language for i in object.projectprogramminglanguage_set.all()]) - - def _hosting_platform(self, object): - return " | ".join([i.hosting_platform.hosting_platform for i in object.projecthostingplatform_set.all()]) + return " | ".join( + [i.language.name for i in object.projectprogramminglanguage_set.all()] + ) -admin.site.register(HostingPlatform) +models = ( + HostingPlatform, + # ProjectHostingPlatform, # WARNING: remove this + License, + ProgrammingLanguage, + Tag, + OperatingSystem, + OperatingSystemVersion, +) +for model in models: + admin.site.register(model) + admin.site.register(Project, ProjectAdmin) -admin.site.register(License) -admin.site.register(ProgrammingLanguage) -admin.site.register(Tag) diff --git a/FOSSDB/apps/fossdb/forms.py b/FOSSDB/apps/fossdb/forms.py index b1f60e2..d51ae69 100644 --- a/FOSSDB/apps/fossdb/forms.py +++ b/FOSSDB/apps/fossdb/forms.py @@ -1,22 +1,40 @@ from django import forms +from .hosting_platform.models import HostingPlatform, ProjectHostingPlatform + from .models import Project class ProjectForm(forms.ModelForm): + hosting_platform = forms.ModelChoiceField(queryset=HostingPlatform.objects.all()) + url = forms.CharField(max_length=100) class Meta: model = Project - fields = ["name", "description", "licenses"] + fields = ( + "name", + "description", + "license", + "tag", + "operating_system", + ) + + exclude = ("hosting_platform",) widgets = { - "name": forms.TextInput(attrs={ - "class": "form-control", - "placeholder": "Project name", - }), - "description": forms.Textarea(attrs={ - "class": "form-control", - "placeholder": "Description", - }), - "licenses": forms.CheckboxSelectMultiple(), + "name": forms.TextInput( + attrs={ + "class": "form-control", + "placeholder": "Project name", + } + ), + "description": forms.Textarea( + attrs={ + "class": "form-control", + "placeholder": "Description", + } + ), + "license": forms.CheckboxSelectMultiple(), + "tag": forms.CheckboxSelectMultiple(), + "operating_system": forms.CheckboxSelectMultiple(), } diff --git a/FOSSDB/apps/fossdb/host/forms.py b/FOSSDB/apps/fossdb/host/forms.py deleted file mode 100644 index 5c04a50..0000000 --- a/FOSSDB/apps/fossdb/host/forms.py +++ /dev/null @@ -1,22 +0,0 @@ -from django import forms - -from fossdb.models import Project - -from .models import HostingPlatform, ProjectHostingPlatform - - -class HostingPlatformForm(forms.ModelForm): - url = forms.URLField() - - class Meta: - model = HostingPlatform - fields = ["hosting_platform", "url"] - - -ProjectHostingPlatformFormSet = forms.inlineformset_factory( - Project, - ProjectHostingPlatform, - form=HostingPlatformForm, - extra=1, - can_delete=False -) diff --git a/FOSSDB/apps/fossdb/host/models.py b/FOSSDB/apps/fossdb/host/models.py deleted file mode 100644 index c401aa0..0000000 --- a/FOSSDB/apps/fossdb/host/models.py +++ /dev/null @@ -1,17 +0,0 @@ -from django.db import models - - -class HostingPlatform(models.Model): - hosting_platform = models.CharField(max_length=100) - - def __str__(self): - return self.hosting_platform - - -class ProjectHostingPlatform(models.Model): - project = models.ForeignKey("Project", on_delete=models.CASCADE) - hosting_platform = models.ForeignKey(HostingPlatform, on_delete=models.CASCADE) - url = models.URLField() - - def __str__(self): - return f"{self.project} | {self.hosting_platform}" diff --git a/FOSSDB/apps/fossdb/hosting_platform/models.py b/FOSSDB/apps/fossdb/hosting_platform/models.py new file mode 100644 index 0000000..49e3020 --- /dev/null +++ b/FOSSDB/apps/fossdb/hosting_platform/models.py @@ -0,0 +1,16 @@ +from django.db import models + + +class HostingPlatform(models.Model): + name = models.CharField(max_length=100, unique=True) + + def __str__(self): + return self.name + + +class ProjectHostingPlatform(models.Model): + hosting_platform = models.ForeignKey(HostingPlatform, on_delete=models.CASCADE) + url = models.URLField(unique=True) + + def __str__(self): + return self.url diff --git a/FOSSDB/apps/fossdb/models.py b/FOSSDB/apps/fossdb/models.py index 5f19875..d8ee372 100644 --- a/FOSSDB/apps/fossdb/models.py +++ b/FOSSDB/apps/fossdb/models.py @@ -3,37 +3,40 @@ import uuid from django.conf import settings from django.db import models -from .host.models import HostingPlatform -from .language.models import ProgrammingLanguage +from .hosting_platform.models import ProjectHostingPlatform from .license.models import License -from .operating_system.models import OperatingSystem -from .star.models import Star +from .operating_system.models import OperatingSystemVersion +from .programming_language.models import ProgrammingLanguage from .tag.models import Tag User = settings.AUTH_USER_MODEL class Project(models.Model): - uuid = models.UUIDField( - primary_key=True, default=uuid.uuid4, editable=False) + uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) author = models.ForeignKey(User, on_delete=models.CASCADE, db_index=True) name = models.CharField(max_length=255) description = models.TextField(blank=True, default="") - licenses = models.ManyToManyField(License) - programming_languages = models.ManyToManyField( - ProgrammingLanguage, through="ProjectProgrammingLanguage", related_name="projects") - hosting_platform = models.ManyToManyField( - HostingPlatform, through="ProjectHostingPlatform", related_name="projects") - tag = models.ManyToManyField(Tag) - os = models.ManyToManyField(OperatingSystem) - star = models.ManyToManyField(Star, related_name="projects_star") + license = models.ManyToManyField(License, blank=True) + programming_language = models.ManyToManyField( + ProgrammingLanguage, + through="ProjectProgrammingLanguage", + related_name="projects", + blank=True, + ) + hosting_platform = models.ForeignKey( + ProjectHostingPlatform, on_delete=models.CASCADE + ) + tag = models.ManyToManyField(Tag, blank=True) + operating_system = models.ManyToManyField(OperatingSystemVersion, blank=True) date_created = models.DateTimeField(auto_now_add=True) @property def star_amount(self): return self.star.count() - def get_absolute_url(self): + @property + def absolute_url(self): return f"/{self.author.name}/{self.name}" def __str__(self): @@ -41,6 +44,5 @@ class Project(models.Model): def save(self, *args, **kwargs): if not self.uuid: - self.uuid = uuid.uuid3( - uuid.uuid4(), f"{self.author.username}-{self.name}") + self.uuid = uuid.uuid3(uuid.uuid4(), f"{self.author.username}-{self.name}") super().save(*args, **kwargs) diff --git a/FOSSDB/apps/fossdb/views.py b/FOSSDB/apps/fossdb/views.py index 4d76938..3d06ac4 100644 --- a/FOSSDB/apps/fossdb/views.py +++ b/FOSSDB/apps/fossdb/views.py @@ -1,12 +1,38 @@ from django.contrib.auth.decorators import login_required, permission_required from django.shortcuts import redirect, render +from django.views.generic import CreateView, DeleteView, DetailView, UpdateView from .forms import ProjectForm -from .host.forms import ProjectHostingPlatformFormSet -from .language.forms import ProjectProgrammingLanguageFormSet +from .hosting_platform.models import ProjectHostingPlatform from .models import Project +@login_required(login_url="login/") +@permission_required("fossdb.add_project", login_url="login/", raise_exception=True) +def add_project(request): + form = ProjectForm(request.POST or None) + + if request.method == "POST": + if form.is_valid(): + project = form.save(commit=False) + project.author = request.user + project_hosting_platform = ProjectHostingPlatform.objects.create( + hosting_platform=form.cleaned_data["hosting_platform"], + url=form.cleaned_data["url"], + ) + project.hosting_platform = project_hosting_platform + project.save() + + form.save_m2m() + return redirect("index") + + context = { + "title": "Add project", + "form": form, + } + return render(request, "fossdb/add_project.html", context) + + def index(request): context = { "title": "FOSSDB", @@ -15,36 +41,8 @@ def index(request): return render(request, "fossdb/index.html", context) -@login_required(login_url="login/") -@permission_required("fossdb.add_project", login_url="login/", raise_exception=True) -def add_project(request): - if request.method == "POST": - project_form = ProjectForm(request.POST) - language_formset = ProjectProgrammingLanguageFormSet(request.POST, instance=Project()) - host_formset = ProjectHostingPlatformFormSet(request.POST, instance=Project()) - if project_form.is_valid() and language_formset.is_valid() and host_formset.is_valid(): - project = project_form.save(commit=False) - project.author = request.user - project.save() - language_formset.instance = project - language_formset.save() - host_formset.instance = project - host_formset.save() - project_form.save_m2m() - return redirect("/") - else: - project_form = ProjectForm() - language_formset = ProjectProgrammingLanguageFormSet() - host_formset = ProjectHostingPlatformFormSet() - context = { - "title": "Add project", - "project_form": project_form, - "language_formset": language_formset, - "host_formset": host_formset, - } - return render(request, "fossdb/add_project.html", context) diff --git a/templates/fossdb/add_project.html b/templates/fossdb/add_project.html index d414e16..962a08e 100644 --- a/templates/fossdb/add_project.html +++ b/templates/fossdb/add_project.html @@ -5,18 +5,7 @@ {% block content %}
{% endblock %} diff --git a/templates/fossdb/index.html b/templates/fossdb/index.html index 3b062bb..2236b47 100644 --- a/templates/fossdb/index.html +++ b/templates/fossdb/index.html @@ -11,26 +11,12 @@{{ project.description }}
-No license
- {% endfor %} -No language
- {% endfor %} -{{ project.date_created }}
{% empty %}No projects yet (