Skip to content
Snippets Groups Projects
Commit f052eb62 authored by Odin Johan Vatne's avatar Odin Johan Vatne
Browse files

Basic functionality

parent 40dedf08
No related branches found
No related tags found
No related merge requests found
Showing
with 350 additions and 2 deletions
...@@ -31,6 +31,7 @@ ALLOWED_HOSTS = [] ...@@ -31,6 +31,7 @@ ALLOWED_HOSTS = []
# Application definition # Application definition
INSTALLED_APPS = [ INSTALLED_APPS = [
'pasapp.apps.PasappConfig',
'django.contrib.admin', 'django.contrib.admin',
'django.contrib.auth', 'django.contrib.auth',
'django.contrib.contenttypes', 'django.contrib.contenttypes',
...@@ -105,7 +106,7 @@ AUTH_PASSWORD_VALIDATORS = [ ...@@ -105,7 +106,7 @@ AUTH_PASSWORD_VALIDATORS = [
LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC' TIME_ZONE = 'CET'
USE_I18N = True USE_I18N = True
...@@ -123,3 +124,5 @@ STATIC_URL = '/static/' ...@@ -123,3 +124,5 @@ STATIC_URL = '/static/'
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
LOGIN_URL = '/login/'
...@@ -14,8 +14,9 @@ Including another URLconf ...@@ -14,8 +14,9 @@ Including another URLconf
2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
""" """
from django.contrib import admin from django.contrib import admin
from django.urls import path from django.urls import include, path
urlpatterns = [ urlpatterns = [
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
path('', include('pasapp.urls'))
] ]
from django.contrib import admin
from .models import *
# Register your models here.
admin.site.register(Project)
admin.site.register(Application)
from django.apps import AppConfig
class PasappConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'pasapp'
from django import forms
from django.contrib.auth.forms import AuthenticationForm, UserCreationForm
from django.contrib.auth.models import Group, User
class NewUserForm(UserCreationForm):
email = forms.EmailField(label='email', max_length=128, required=True)
isProfessor = forms.BooleanField(
label='Are you a professor?', required=False)
class Meta:
model = User
fields = ("username", "email", "password1", "password2", "isProfessor")
def save(self, commit=True):
user = super(NewUserForm, self).save(commit=False)
user.email = self.cleaned_data['email']
if commit:
user.save()
user_group = 'professor' if self.cleaned_data['isProfessor'] else 'student'
user.groups.add(Group.objects.get(name=user_group))
return user
# Generated by Django 3.2.9 on 2021-12-11 16:48
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Project',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=200)),
('status', models.CharField(max_length=128)),
('professor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='Application',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('message', models.CharField(max_length=2000)),
('date', models.DateTimeField(verbose_name='date sent')),
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pasapp.project')),
('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]
# Generated by Django 3.2.9 on 2021-12-12 10:34
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('pasapp', '0001_initial'),
]
operations = [
migrations.RemoveField(
model_name='application',
name='date',
),
migrations.AddField(
model_name='application',
name='date sent',
field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
preserve_default=False,
),
migrations.AddField(
model_name='project',
name='description',
field=models.CharField(default='No description available.', max_length=2048),
preserve_default=False,
),
]
# Generated by Django 3.2.9 on 2021-12-12 10:50
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('pasapp', '0002_auto_20211212_1134'),
]
operations = [
migrations.RenameField(
model_name='application',
old_name='date sent',
new_name='date_sent',
),
]
from django.conf import settings
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Project(models.Model):
title = models.CharField(max_length=200)
professor = models.ForeignKey(User, on_delete=models.CASCADE)
description = models.CharField(max_length=2048)
status = models.CharField(max_length=128)
def __str__(self):
return f'{self.title}, by {self.professor}. Status: {self.status}'
class Application(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE)
student = models.ForeignKey(User, on_delete=models.CASCADE)
message = models.CharField(max_length=2000)
date = models.DateTimeField(auto_now_add=True, name='date_sent')
def __str__(self):
return f'{self.student} on {self.project}'
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Log In | PAS</title>
</head>
<body>
<form action="/login/" method="post">
{% csrf_token %} {{ form }}
<input type="submit" value="Log In" />
</form>
<form action="/logout/" method="post">
{% csrf_token %}
<input type="submit" value="Log out" />
</form>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>{{project.title}} | PAS</title>
</head>
<body>
<h1>{{project.title}}</h1>
{% if applications %}
<ul>
{% for application in applications %}
<li>
{{application.student}} on {{application.date_sent}}
<br />
{{application.message}}
</li>
{% endfor %}
</ul>
{% else %}
<p>No applications for this project have been sent yet.</p>
{% endif %}
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>{{project.title}} | PAS</title>
</head>
<body>
<h1>{{project.title}}</h1>
<h3>{{project.professor}}</h3>
<p>{{project.description}}</p>
<em>Status: </em>{{project.status}}
<br />
<form action="/apply/{{project.id}}/" method="post">
{% csrf_token %} {{ form }}
<input type="submit" value="Apply" />
</form>
<p>(i) {{numApplicants}} students have applied so far.</p>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Projects | PAS</title>
</head>
<body>
{% if projects %}
<ul>
{% for project in projects %}
<li>
<a href="{% url 'project_detail' project.id %}">{{ project.title }}</a>
by {{project.professor}}
<br />
<em>Status: </em>{{project.status}}
</li>
{% endfor %}
</ul>
{% else %}
<p>No projects are available.</p>
{% endif %}
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Register | PAS</title>
</head>
<body>
<form action="/register/" method="post">
{% csrf_token %} {{ form }}
<input type="submit" value="Sign Up" />
</form>
</body>
</html>
from django.test import TestCase
# Create your tests here.
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('login/', views.login_view, name='login'),
path('logout/', views.logout_view, name='logout'),
path('register/', views.register, name='register'),
path('project/<int:project_id>/',
views.project_details, name='project_detail'),
path('apply/<int:project_id>/', views.apply, name='apply'),
path('project/<int:project_id>/applications',
views.project_applications, name='project_applications'),
]
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import AuthenticationForm
from django.core.checks import messages
from django.http.response import Http404, HttpResponseForbidden, HttpResponseRedirect
from django.shortcuts import get_object_or_404, redirect, render
from django.http import HttpResponse
from pasapp.forms import NewUserForm
from pasapp.models import Application, Project
# Create your views here.
def index(request):
projects = Project.objects.order_by('-title')
context = {'projects': projects}
return render(request, 'pasapp/projects.html', context)
def project_details(request, project_id):
project = get_object_or_404(Project, pk=project_id)
numApplicants = Application.objects.filter(project=project_id).count()
context = {'project': project, 'numApplicants': numApplicants}
return render(request, 'pasapp/project_details.html', context)
def apply(request, project_id):
if request.method == 'GET':
raise Http404("This endpoint does not support GET requests.")
project = get_object_or_404(Project, pk=project_id)
student = request.user
if student is None:
return redirect("login")
application = Application(
project=project, student=student, message="test123")
application.save()
return redirect("index")
@login_required
def project_applications(request, project_id):
project = get_object_or_404(Project, pk=project_id)
if not request.user is project.professor:
return HttpResponseForbidden()
applications = Application.objects.filter(
project=project_id).order_by('-date_sent')
context = {'project': project, 'applications': applications}
return render(request, 'pasapp/project_applications.html', context)
def register(request):
if request.method == 'POST':
form = NewUserForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
return redirect("index")
else:
form = NewUserForm()
return render(request, 'pasapp/register.html', {'form': form})
def login_view(request):
if request.method == 'POST':
form = AuthenticationForm(data=request.POST)
print(form)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
print(password)
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
return redirect('index')
print(form.non_field_errors())
return HttpResponse("fuck")
else:
form = AuthenticationForm()
return render(request, 'pasapp/login.html', {'form': form})
def logout_view(request):
logout(request)
return redirect('index')
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment