diff --git a/FOSSDB_web/apps/fossdb/admin.py b/FOSSDB_web/apps/fossdb/admin.py deleted file mode 100644 index 4185d36..0000000 --- a/FOSSDB_web/apps/fossdb/admin.py +++ /dev/null @@ -1,3 +0,0 @@ -# from django.contrib import admin - -# Register your models here. diff --git a/FOSSDB_web/apps/fossdb/models.py b/FOSSDB_web/apps/fossdb/models.py deleted file mode 100644 index 0b4331b..0000000 --- a/FOSSDB_web/apps/fossdb/models.py +++ /dev/null @@ -1,3 +0,0 @@ -# from django.db import models - -# Create your models here. diff --git a/FOSSDB_web/apps/fossdb/tests.py b/FOSSDB_web/apps/fossdb/tests.py deleted file mode 100644 index a79ca8b..0000000 --- a/FOSSDB_web/apps/fossdb/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -# from django.test import TestCase - -# Create your tests here. diff --git a/FOSSDB_web/apps/fossdb/views.py b/FOSSDB_web/apps/fossdb/views.py deleted file mode 100644 index fd0e044..0000000 --- a/FOSSDB_web/apps/fossdb/views.py +++ /dev/null @@ -1,3 +0,0 @@ -# from django.shortcuts import render - -# Create your views here. diff --git a/requirements.txt b/requirements.txt index fc6e18e..92f1e03 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,5 +2,5 @@ Django==4.2.2 Pillow==9.5.0 fontawesomefree==6.4.0 mysqlclient==2.1.1 -django-filter==23.2 django-tailwind==3.6.0 +django-search-views==0.3.7 diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index e918694..0000000 --- a/setup.cfg +++ /dev/null @@ -1,34 +0,0 @@ -[metadata] -name = FOSSDB-Web -description = Free and Open-Source Software Database Website -author = Kristofers Solo -license = GPL3 -license_files = LICENSE -platforms = unix, linux, osx, cygwin, win32 -classifiers = - Programming Language :: Python :: 3.10 - -[options] -packages = FOSSDB_web -install_requires = - Django>=4.1 - fontawesomefree>=6.2.1 - mysqlclient>=2.1.1 - -python_requires = >=3.10 -package_dir = =. -zip_safe = no - -[options.extras_require] -testing = - flake8>=6.0.0 - mypy>=0.991 - pytest-cov>=4.0.0 - pytest>=7.2.0 - tox>=3.27.1 - -[options.package_data] -detector = py.typed - -[flake8] -max-line-length = 160 diff --git a/src/FOSSDB/settings.py b/src/FOSSDB/settings.py index 060c0c0..2fbc9f6 100644 --- a/src/FOSSDB/settings.py +++ b/src/FOSSDB/settings.py @@ -38,10 +38,9 @@ INSTALLED_APPS = [ "main", "account", "fossdb", - "django_filters", + "search_views", "tailwind", "tokyonight_night", - "crispy_forms", "fontawesomefree", "django.contrib.admin", "django.contrib.auth", @@ -51,6 +50,13 @@ INSTALLED_APPS = [ "django.contrib.staticfiles", ] +TAILWIND_APP_NAME = "tokyonight_night" + +INTERNAL_IPS = [ + "127.0.0.1", +] + + MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", @@ -157,12 +163,6 @@ LOGOUT_REDIRECT_URL = "/" LOGIN_URL = "/login/" -TAILWIND_APP_NAME = "tokyonight_night" - -INTERNAL_IPS = [ - "127.0.0.1", -] - # HTTPS settings # SESSION_COOKIE_SECURE = True # CSRF_COOKIE_SECURE = True diff --git a/src/FOSSDB/urls.py b/src/FOSSDB/urls.py index 7a48efe..bc637e9 100644 --- a/src/FOSSDB/urls.py +++ b/src/FOSSDB/urls.py @@ -19,10 +19,9 @@ from django.urls import include, path urlpatterns = [ path("admin/", admin.site.urls), - path("", include("fossdb.urls")), path("", include("main.urls")), - path("", include("account.urls")), - path("", include("django.contrib.auth.urls")), + path("auth/", include("account.urls")), + path("//", include("fossdb.urls")), ] if settings.DEBUG: from django.conf.urls.static import static diff --git a/src/apps/account/forms.py b/src/apps/account/forms.py index c5ac173..caf7202 100644 --- a/src/apps/account/forms.py +++ b/src/apps/account/forms.py @@ -1,12 +1,31 @@ from django import forms -from django.contrib.auth.forms import UserCreationForm +from django.contrib.auth.forms import AuthenticationForm, UserChangeForm as BaseUserChangeForm, UserCreationForm -from .models import User +from .models import Profile, User + + +class LoginForm(AuthenticationForm): + def __init__(self, *args, **kwargs): + super(LoginForm, self).__init__(*args, **kwargs) + self.fields["username"].widget = forms.TextInput( + attrs={ + "placeholder": "Username", + "class": "verify form-field submit-form", + } + ) + self.fields["username"].label = "" + self.fields["password"].widget = forms.PasswordInput( + attrs={ + "placeholder": "Password", + "class": "verify form-field submit-form", + } + ) + self.fields["password"].label = "" class SignUpForm(UserCreationForm): - email = forms.EmailField(required=False, help_text="Optional.") + email = forms.EmailField(required=False) class Meta: model = User @@ -16,3 +35,99 @@ class SignUpForm(UserCreationForm): "password1", "password2", ) + + widgets = { + "username": forms.TextInput( + attrs={ + "placeholder": "Username", + "class": "verify form-field submit-form", + } + ), + "email": forms.EmailInput( + attrs={ + "placeholder": "Email (optional)", + "class": "verify form-field submit-form", + } + ), + "password1": forms.PasswordInput( + attrs={ + "placeholder": "Password", + "class": "verify form-field submit-form", + } + ), + "password2": forms.PasswordInput( + attrs={ + "placeholder": "Confirm password", + "class": "verify form-field submit-form", + } + ), + } + labels = { + "username": "", + "email": "", + "password1": "", + "password2": "", + } + + +class UserChangeForm(BaseUserChangeForm): + class Meta(BaseUserChangeForm.Meta): + model = User + fields = ( + "username", + "email", + "first_name", + "last_name", + ) + widgets = { + "username": forms.TextInput( + attrs={ + "placeholder": "Username", + "class": "form-field submit-form", + } + ), + "email": forms.EmailInput( + attrs={ + "placeholder": "Email", + "class": "form-field submit-form", + } + ), + "first_name": forms.TextInput( + attrs={ + "placeholder": "First Name", + "class": "form-field submit-form", + } + ), + "last_name": forms.TextInput( + attrs={ + "placeholder": "Last Name", + "class": "form-field submit-form", + } + ), + } + labels = { + "username": "", + "email": "", + "first_name": "", + "last_name": "", + } + + help_text = { + "username": None, + "email": None, + "first_name": None, + "last_name": None, + } + + +class ProfileForm(forms.ModelForm): + class Meta: + model = Profile + fields = ("picture",) + labels = { + "picture": "", + } + + help_text = { + "picture": None, + } diff --git a/src/apps/account/templates/login.html b/src/apps/account/templates/login.html index 2552358..44b76df 100644 --- a/src/apps/account/templates/login.html +++ b/src/apps/account/templates/login.html @@ -8,25 +8,13 @@
{% csrf_token %} - - {% if form.username.errors %}

{{ form.username.errors }}

{% endif %} - - {% if form.password.errors %}

{{ form.password.errors }}

{% endif %} + {{ form }} + class="button submit-button-disabled text-lightsteelblue-100 bg-slategray-200">Login

- Don't have an account? Create one Here! + Don't have an account? Create one Here!

{% endblock %} diff --git a/src/apps/account/templates/password.html b/src/apps/account/templates/password.html new file mode 100644 index 0000000..434c688 --- /dev/null +++ b/src/apps/account/templates/password.html @@ -0,0 +1,16 @@ +{% extends "base.html" %} +{% load static %} +{% block title %}{{ title }}{% endblock %} +{% block meta %}{% endblock %} +{% block content %} +
+
+

Change password

+ {% csrf_token %} + {{ form }} + +
+
+{% endblock %} diff --git a/src/apps/account/templates/profile.html b/src/apps/account/templates/profile.html index 3c93cfb..f825d88 100644 --- a/src/apps/account/templates/profile.html +++ b/src/apps/account/templates/profile.html @@ -3,8 +3,28 @@ {% block title %}{{ title }}{% endblock %} {% block meta %}{% endblock %} {% block content %} -

{{ user.username }}

- {{ user.username }}’s profile picture -

{{ user.email }}

+
+ +

My Projects

+
+ {% for project in projects %} +
+ +

{{ project.name }}

+
+

{{ project.description|slice:500 }}

+
+ {% empty %} +

No projects yet.

+ {% endfor %} +
+
{% endblock %} diff --git a/src/apps/account/templates/setting.html b/src/apps/account/templates/setting.html new file mode 100644 index 0000000..accbc54 --- /dev/null +++ b/src/apps/account/templates/setting.html @@ -0,0 +1,24 @@ +{% extends "base.html" %} +{% load static %} +{% block title %}{{ title }}{% endblock %} +{% block meta %}{% endblock %} +{% block content %} +
+
+ + + +
+
+

Edit profile

+ {% csrf_token %} + {{ user_form.username }} + {{ user_form.email }} + {{ user_form.first_name }} + {{ user_form.last_name }} + +
+
+{% endblock %} diff --git a/src/apps/account/templates/signup.html b/src/apps/account/templates/signup.html index aa76e63..2767fc9 100644 --- a/src/apps/account/templates/signup.html +++ b/src/apps/account/templates/signup.html @@ -13,33 +13,31 @@ placeholder="Username" name="username" value="{{ form.username.value|default:'' }}" - class="verify mt-1 block rounded-md border-2 border-slategray-200 hover:border-lightsteelblue-100 bg-gray-300 placeholder-lightsteelblue-100 focus:border-cadetblue-300" /> + class="verify form-field submit-form" /> {% if form.username.errors %}

{{ form.username.errors }}

{% endif %} + class="form-field submit-form" /> {% if form.email.errors %}

{{ form.email.errors }}

{% endif %} + class="verify form-field submit-form" /> {% if form.password1.errors %}

{{ form.password1.errors }}

{% endif %} + class="verify form-field submit-form" /> {% if form.password2.errors %}

{{ form.password2.errors }}

{% endif %} -

- Have an account? Login Here! -

- + class="button submit-button-disabled text-lightsteelblue-100 bg-slategray-200" />Sign Up +

+ Have an account? Login Here! +

+ {% endblock %} diff --git a/src/apps/account/urls.py b/src/apps/account/urls.py index c812fd2..8763cce 100644 --- a/src/apps/account/urls.py +++ b/src/apps/account/urls.py @@ -5,5 +5,7 @@ from . import views urlpatterns = [ path("signup/", views.signup_view, name="signup"), path("login/", views.login_view, name="login"), - path("/", views.profile, name="profile"), + path("logout/", views.LogoutView.as_view(), name="logout"), + path("settings/", views.ProfileUpdateView.as_view(), name="settings"), + path("settings/security/", views.PasswordChangeView.as_view(), name="change_password"), ] diff --git a/src/apps/account/views.py b/src/apps/account/views.py index da3c102..7ba82a1 100644 --- a/src/apps/account/views.py +++ b/src/apps/account/views.py @@ -1,19 +1,82 @@ -from django.contrib.auth import authenticate, login -from django.contrib.auth.forms import AuthenticationForm -from django.shortcuts import get_object_or_404, redirect, render +from django.contrib import messages +from django.contrib.auth import authenticate, login, logout, update_session_auth_hash +from django.contrib.auth.forms import PasswordChangeForm +from django.contrib.auth.mixins import LoginRequiredMixin +from django.shortcuts import redirect, render +from django.views.generic import ListView, TemplateView, View -from .forms import SignUpForm -from .models import User +from fossdb.models import Project + +from .forms import LoginForm, SignUpForm, UserChangeForm -def profile(request, username): - user = get_object_or_404(User, username=username) +class ProfileUpdateView(LoginRequiredMixin, TemplateView): + template_name = "setting.html" + login_url = "/login/" + redirect_field_name = "redirect_to" - context = { - "title": user.username + ("" if not user.full_name else f" ({user.full_name})"), - "user": user, - } - return render(request, "profile.html", context) + def get(self, request): + user_form = UserChangeForm(instance=request.user) + context = { + "title": "Your profile", + "user_form": user_form, + } + return self.render_to_response(context) + + def post(self, request): + user_form = UserChangeForm(request.POST, instance=request.user) + + if user_form.is_valid(): + user_form.save() + messages.add_message(request, messages.SUCCESS, "Your profile was successfully updated!") + + context = { + "title": "Your profile", + "user_form": user_form, + } + return self.render_to_response(context) + + +class PasswordChangeView(LoginRequiredMixin, TemplateView): + template_name = "password.html" + + def get(self, request): + form = PasswordChangeForm(user=request.user) + context = { + "title": "Change password", + "form": form, + } + return self.render_to_response(context) + + def post(self, request): + form = PasswordChangeForm(data=request.POST, user=request.user) + if form.is_valid(): + form.save() + + update_session_auth_hash(request, form.user) + messages.add_message(request, messages.SUCCESS, "Your password was successfully updated!") + + context = { + "title": "Change password", + "form": form, + } + return self.render_to_response(context) + + +class ProfileProjectListView(LoginRequiredMixin, ListView): + model = Project + template_name = "profile.html" + context_object_name = "projects" + login_url = "/login/" + redirect_field_name = "redirect_to" + + def get_queryset(self): + return Project.objects.filter(owner=self.request.user) + + def get_context_data(self, *args, **kwargs): + data = super().get_context_data(**kwargs) + data["title"] = self.request.user.username + ("" if not self.request.user.full_name else f" ({self.request.user.full_name})") + return data def signup_view(request): @@ -34,7 +97,7 @@ def signup_view(request): def login_view(request): - form = AuthenticationForm(data=request.POST or None) + form = LoginForm(data=request.POST or None) if request.method == "POST": if form.is_valid(): user = form.get_user() @@ -46,3 +109,9 @@ def login_view(request): "form": form, } return render(request, "login.html", context) + + +class LogoutView(View): + def get(self, request): + logout(request) + return redirect("login") diff --git a/src/apps/fossdb/filters.py b/src/apps/fossdb/filters.py deleted file mode 100644 index cc81ca6..0000000 --- a/src/apps/fossdb/filters.py +++ /dev/null @@ -1,28 +0,0 @@ -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/src/apps/fossdb/forms.py b/src/apps/fossdb/forms.py index ab183df..6dcec12 100644 --- a/src/apps/fossdb/forms.py +++ b/src/apps/fossdb/forms.py @@ -1,19 +1,33 @@ from django import forms +from django.forms import inlineformset_factory -from .models import HostingPlatform, ProgrammingLanguage, Project, ProjectHostingPlatform, ProjectProgrammingLanguage +from .models import HostingPlatform, License, OperatingSystemVersion, ProgrammingLanguage, Project, ProjectHostingPlatform, ProjectProgrammingLanguage, Tag class HostingPlatformForm(forms.ModelForm): class Meta: model = ProjectHostingPlatform fields = ( - "url", "hosting_platform", + "url", ) widgets = { "hosting_platform": forms.Select( choices=HostingPlatform.objects.all(), - ) + attrs={ + "class": "form-field submit-form", + }, + ), + "url": forms.URLInput( + attrs={ + "placeholder": "url", + "class": "form-field submit-form font-roboto", + }, + ), + } + labels = { + "hosting_platform": "", + "url": "", } @@ -27,14 +41,32 @@ class ProgrammingLanguageForm(forms.ModelForm): widgets = { "programming_language": forms.Select( choices=ProgrammingLanguage.objects.all(), + attrs={ + "class": "form-field submit-form", + }, ), "percentage": forms.NumberInput( attrs={ + "placeholder": "Percentage", + "class": "form-field submit-form", "min": "0", "max": "100", - } + }, ), } + labels = { + "programming_language": "", + "percentage": "", + } + + +ProgrammingLanguageInlineFormSet = inlineformset_factory( + Project, + ProjectProgrammingLanguage, + form=ProgrammingLanguageForm, + extra=0, + can_delete=True, +) class ProjectForm(forms.ModelForm): @@ -51,17 +83,39 @@ class ProjectForm(forms.ModelForm): widgets = { "name": forms.TextInput( attrs={ - "class": "form-control", "placeholder": "Project name", - } + "class": "form-field submit-form font-roboto", + }, ), "description": forms.Textarea( attrs={ - "class": "form-control", "placeholder": "Description", - } + "class": "form-field submit-form font-roboto", + }, + ), + "license": forms.CheckboxSelectMultiple( + choices=License.objects.all(), + attrs={ + "class": "checkbox-form", + }, + ), + "operating_system": forms.CheckboxSelectMultiple( + choices=OperatingSystemVersion.objects.all(), + attrs={ + "class": "checkbox-form", + }, + ), + "tag": forms.CheckboxSelectMultiple( + choices=Tag.objects.all(), + attrs={ + "class": "checkbox-form", + }, ), - "license": forms.CheckboxSelectMultiple(), - "tag": forms.CheckboxSelectMultiple(), - "operating_system": forms.CheckboxSelectMultiple(), + } + labels = { + "name": "", + "description": "", + "license": "", + "tag": "", + "operating_system": "", } diff --git a/src/apps/fossdb/migrations/0006_alter_projectprogramminglanguage_percentage.py b/src/apps/fossdb/migrations/0006_alter_projectprogramminglanguage_percentage.py new file mode 100644 index 0000000..7903849 --- /dev/null +++ b/src/apps/fossdb/migrations/0006_alter_projectprogramminglanguage_percentage.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.2 on 2023-06-29 14:29 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('fossdb', '0005_operatingsystem_is_linux'), + ] + + operations = [ + migrations.AlterField( + model_name='projectprogramminglanguage', + name='percentage', + field=models.PositiveIntegerField(blank=True, default=0), + ), + ] diff --git a/src/apps/fossdb/migrations/0007_alter_license_full_name_alter_license_short_name_and_more.py b/src/apps/fossdb/migrations/0007_alter_license_full_name_alter_license_short_name_and_more.py new file mode 100644 index 0000000..274daa0 --- /dev/null +++ b/src/apps/fossdb/migrations/0007_alter_license_full_name_alter_license_short_name_and_more.py @@ -0,0 +1,43 @@ +# Generated by Django 4.2.2 on 2023-06-29 15:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('fossdb', '0006_alter_projectprogramminglanguage_percentage'), + ] + + operations = [ + migrations.AlterField( + model_name='license', + name='full_name', + field=models.CharField(db_index=True, max_length=100, unique=True), + ), + migrations.AlterField( + model_name='license', + name='short_name', + field=models.CharField(db_index=True, max_length=50, unique=True), + ), + migrations.AlterField( + model_name='operatingsystem', + name='name', + field=models.CharField(db_index=True, max_length=100, unique=True), + ), + migrations.AlterField( + model_name='programminglanguage', + name='name', + field=models.CharField(db_index=True, max_length=100, unique=True), + ), + migrations.AlterField( + model_name='project', + name='description', + field=models.TextField(blank=True, db_index=True, default=''), + ), + migrations.AlterField( + model_name='project', + name='name', + field=models.CharField(db_index=True, max_length=255), + ), + ] diff --git a/src/apps/fossdb/migrations/0008_alter_project_description.py b/src/apps/fossdb/migrations/0008_alter_project_description.py new file mode 100644 index 0000000..d54832c --- /dev/null +++ b/src/apps/fossdb/migrations/0008_alter_project_description.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.2 on 2023-06-29 15:07 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('fossdb', '0007_alter_license_full_name_alter_license_short_name_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='project', + name='description', + field=models.TextField(blank=True, default=''), + ), + ] diff --git a/src/apps/fossdb/migrations/0009_delete_star.py b/src/apps/fossdb/migrations/0009_delete_star.py new file mode 100644 index 0000000..b914513 --- /dev/null +++ b/src/apps/fossdb/migrations/0009_delete_star.py @@ -0,0 +1,16 @@ +# Generated by Django 4.2.2 on 2023-06-29 16:51 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('fossdb', '0008_alter_project_description'), + ] + + operations = [ + migrations.DeleteModel( + name='Star', + ), + ] diff --git a/src/apps/fossdb/models.py b/src/apps/fossdb/models.py index 22697a1..117f556 100644 --- a/src/apps/fossdb/models.py +++ b/src/apps/fossdb/models.py @@ -6,8 +6,8 @@ from django.db import models class License(models.Model): - short_name = models.CharField(max_length=50, unique=True) - full_name = models.CharField(max_length=100, unique=True) + short_name = models.CharField(max_length=50, unique=True, db_index=True) + full_name = models.CharField(max_length=100, unique=True, db_index=True) url = models.URLField(blank=True, default="") text = models.TextField(blank=True, default="") @@ -16,7 +16,7 @@ class License(models.Model): class OperatingSystem(models.Model): - name = models.CharField(max_length=100, unique=True) + name = models.CharField(max_length=100, unique=True, db_index=True) description = models.TextField(blank=True, default="") is_linux = models.BooleanField(blank=True, default=False) @@ -55,7 +55,7 @@ class Tag(models.Model): class ProgrammingLanguage(models.Model): - name = models.CharField(max_length=100, unique=True) + name = models.CharField(max_length=100, unique=True, db_index=True) def __str__(self): return self.name @@ -64,7 +64,7 @@ class ProgrammingLanguage(models.Model): class Project(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, verbose_name="ID") owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) - name = models.CharField(max_length=255) + name = models.CharField(max_length=255, db_index=True) description = models.TextField(blank=True, default="") license = models.ManyToManyField(License, blank=True) tag = models.ManyToManyField(Tag, blank=True) @@ -72,10 +72,6 @@ class Project(models.Model): programming_language = models.ManyToManyField(ProgrammingLanguage, through="ProjectProgrammingLanguage", blank=True) date_created = models.DateTimeField(auto_now_add=True) - @property - def star_amount(self): - return self.star.count() - @property def runs_on_macos(self): return self.operating_system.filter(operating_system__name="macOS").exists() @@ -117,7 +113,7 @@ class Project(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(blank=True, null=True) + percentage = models.PositiveIntegerField(blank=True, default=0) def __str__(self): return f"{self.project.owner}/{self.project.name} | {self.programming_language} | {self.percentage}%" @@ -137,8 +133,3 @@ class ProjectHostingPlatform(models.Model): def __str__(self): return self.url - - -class Star(models.Model): - user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) - project = models.ForeignKey(Project, on_delete=models.CASCADE) diff --git a/src/apps/fossdb/templates/create_view.html b/src/apps/fossdb/templates/create_view.html index 150fc0c..433bef8 100644 --- a/src/apps/fossdb/templates/create_view.html +++ b/src/apps/fossdb/templates/create_view.html @@ -3,32 +3,62 @@ {% 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 %} + {{ form.name }} + {{ form.description }} +
+
+

Licenses

+ {{ form.license }} +
+
+

Tags

+ {{ form.tag }} +
+
+

Operating systems

+ {{ form.operating_system }} +
- - - - - - + {{ hosting_platform.management_form }} +
+

Hosting platform:

+ {{ hosting_platform }} +
+ {{ programming_languages.management_form }} + +
+ {% for language in programming_languages %}
{{ language }}
{% endfor %} +
+ + +
+
+ +
+
+ - {% endblock %} diff --git a/src/apps/fossdb/templates/delete_view.html b/src/apps/fossdb/templates/delete_view.html index 4b0f0d1..1b20a74 100644 --- a/src/apps/fossdb/templates/delete_view.html +++ b/src/apps/fossdb/templates/delete_view.html @@ -1,6 +1,6 @@ {% extends "base.html" %} {% load static %} -{% block title %}Delete {{ project }}{% endblock %} +{% block title %}{{ title }}{% endblock %} {% block content %}
+ class="text-center form-field border-slategray-200 hover:border-lightcoral bg-gray-300 focus:border-indianred-100 transition ease-linear" />