Skip to content

Commit

Permalink
Merge pull request #46 from IEEE-NITK/embedathon_registration
Browse files Browse the repository at this point in the history
Embedathon Registration
  • Loading branch information
anirudhprabhakaran3 authored Dec 11, 2023
2 parents 4d385db + 8cbd1b1 commit c271c52
Show file tree
Hide file tree
Showing 13 changed files with 470 additions and 54 deletions.
2 changes: 2 additions & 0 deletions corpus/config/models.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from django.db import models

DATETIME_FORMAT = "%d-%m-%Y %H:%M:%S"


class Society(models.Model):
"""
Expand Down
35 changes: 35 additions & 0 deletions corpus/corpus/decorators.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from config.models import ModuleConfiguration
from django.contrib import messages
from django.shortcuts import redirect


def module_enabled(module_name):
def decorator(view_func):
def wrapper(request, *args, **kwargs):
try:
config = ModuleConfiguration.objects.get(module_name=module_name)
except ModuleConfiguration.DoesNotExist:
messages.error(
request,
"""
Module Configuration does not exist.
Please contact the administrators!
""",
)
return redirect("index")

if not config.module_enabled:
messages.error(
request,
"""
Module has not been enabled.
Please contact the administrators!
""",
)
return redirect("index")

return view_func(request, *args, **kwargs)

return wrapper

return decorator
30 changes: 30 additions & 0 deletions corpus/corpus/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
from django import forms


# Not exactly DRY, but I don't know of any cleaner way to do it.


class CorpusForm(forms.Form):
def __init__(self, *args, **kwargs):
super(CorpusForm, self).__init__(*args, **kwargs)
for visible in self.visible_fields():
visible.field.widget.attrs[
"class"
] = """
mt-1 block w-full rounded-md border-base-800
text-black shadow-sm focus:border-primary
focus:ring focus:ring-primary-200 focus:ring-opacity-50
"""


class CorpusModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(CorpusModelForm, self).__init__(*args, **kwargs)
for visible in self.visible_fields():
visible.field.widget.attrs[
"class"
] = """
mt-1 block w-full rounded-md border-base-800
text-black shadow-sm focus:border-primary
focus:ring focus:ring-primary-200 focus:ring-opacity-50
"""
1 change: 1 addition & 0 deletions corpus/corpus/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,5 @@
path("admin/", admin.site.urls),
path("", include("pages.urls")),
path("accounts/", include("accounts.urls")),
path("embedathon/", include("embedathon.urls")),
]
9 changes: 6 additions & 3 deletions corpus/embedathon/admin.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# from django.contrib import admin
#
# # Register your models here.
from django.contrib import admin
from embedathon.models import EmbedathonUser

# Register your models here.

admin.site.register(EmbedathonUser)
18 changes: 18 additions & 0 deletions corpus/embedathon/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from embedathon.models import EmbedathonUser

from corpus.forms import CorpusModelForm


class EmbedathonForm(CorpusModelForm):
class Meta:
model = EmbedathonUser
fields = [
"from_nitk",
"college_name",
"course",
"year",
"branch",
"ieee_member",
"ieee_membership_no",
"cass_member",
]
58 changes: 58 additions & 0 deletions corpus/embedathon/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# Generated by Django 4.2.4 on 2023-12-10 14:14
import django.db.models.deletion
from django.conf import settings
from django.db import migrations
from django.db import models


class Migration(migrations.Migration):

initial = True

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.CreateModel(
name="EmbedathonUser",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("from_nitk", models.BooleanField(default=True)),
(
"college_name",
models.CharField(
default="National Institute of Technology Karnataka",
max_length=200,
),
),
(
"course",
models.CharField(
choices=[("B", "B.Tech."), ("M", "M.Tech."), ("P", "PhD")],
max_length=1,
),
),
("year", models.IntegerField()),
("branch", models.CharField(max_length=200)),
("ieee_member", models.BooleanField(default=False)),
("ieee_membership_no", models.BigIntegerField(blank=True, null=True)),
("cass_member", models.BooleanField(default=False)),
(
"user",
models.OneToOneField(
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
),
),
],
),
]
26 changes: 23 additions & 3 deletions corpus/embedathon/models.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,23 @@
# from django.db import models
#
# # Create your models here.
from accounts.models import User
from django.db import models

# Create your models here.

COURSES = [("B", "B.Tech."), ("M", "M.Tech."), ("P", "PhD")]


class EmbedathonUser(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
from_nitk = models.BooleanField(default=True)
college_name = models.CharField(
max_length=200, default="National Institute of Technology Karnataka"
)
course = models.CharField(max_length=1, choices=COURSES)
year = models.IntegerField(blank=False, null=False)
branch = models.CharField(max_length=200, blank=False, null=False)
ieee_member = models.BooleanField(default=False)
ieee_membership_no = models.BigIntegerField(blank=True, null=True)
cass_member = models.BooleanField(default=False)

def __str__(self):
return self.user.__str__()
7 changes: 7 additions & 0 deletions corpus/embedathon/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from django.urls import path
from embedathon import views

urlpatterns = [
path("", views.index, name="embedathon_index"),
path("register", views.register, name="embedathon_register"),
]
76 changes: 73 additions & 3 deletions corpus/embedathon/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,73 @@
# from django.shortcuts import render
#
# # Create your views here.
from datetime import datetime

from config.models import DATETIME_FORMAT
from config.models import ModuleConfiguration
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
from django.shortcuts import render
from embedathon.forms import EmbedathonForm
from embedathon.models import EmbedathonUser

from corpus.decorators import module_enabled


# Create your views here.


@login_required
@module_enabled(module_name="embedathon")
def index(request):
try:
embedathon_user = EmbedathonUser.objects.get(user=request.user)
except EmbedathonUser.DoesNotExist:
messages.error(request, "Please register for Embedathon first!")
return redirect("embedathon_register")

args = {"embedathon_user": embedathon_user}

return render(request, "embedathon/index.html", args)


@login_required
@module_enabled(module_name="embedathon")
def register(request):
config = ModuleConfiguration.objects.get(module_name="embedathon").module_config

reg_start_datetime, reg_end_datetime = (
config["reg_start_datetime"],
config["reg_end_datetime"],
)
reg_start_datetime, reg_end_datetime = datetime.strptime(
reg_start_datetime, DATETIME_FORMAT
), datetime.strptime(reg_end_datetime, DATETIME_FORMAT)
registration_active = (reg_start_datetime <= datetime.now()) and (
datetime.now() <= reg_end_datetime
)

if not registration_active:
messages.error(request, "Registration for Embedathon is not active yet.")
return redirect("index")

try:
embedathon_user = EmbedathonUser.objects.get(user=request.user)
if embedathon_user:
messages.info(request, "You have already registered!")
return redirect("embedathon_index")
except EmbedathonUser.DoesNotExist:
pass

if request.method == "POST":
form = EmbedathonForm(request.POST)
if form.is_valid():
embedathon_user = form.save(commit=False)
embedathon_user.user = request.user
embedathon_user.save()
messages.success(request, "Registration successful")
return redirect("embedathon_index")
else:
form = EmbedathonForm()

args = {"form": form}

return render(request, "embedathon/register.html", args)
95 changes: 50 additions & 45 deletions corpus/templates/accounts/login.html
Original file line number Diff line number Diff line change
@@ -1,61 +1,66 @@
{% extends 'base.html' %}

{% block title %}
Login
Login
{% endblock %}

{% block content %}
<div class="card w-3/4 lg:w-1/3 mx-auto my-10 bg-base-200 shadow-xl">
<div class="card-body">
<h1 class="card-title text-2xl">Login</h1>

<form method="post" action="{% url 'accounts_signin' %}" class="py-5">
{% csrf_token %}

{% if form.non_field_errors %}
{% for error in form.non_field_errors %}
<div role="alert" class="alert alert-error mt-1">
<span>{{ error }}</span>
</div>
{% endfor %}
{% endif %}

<div class="w-full my-2">
<label for="{{ form.email.id_for_label }}">Email</label>
{{ form.username }}
{% if form.username.errors %}
<div class="my-1">
<div role="alert" class="alert alert-error">
{{ form.username.errors }}
</div>
</div>
<div class="card w-3/4 lg:w-1/3 mx-auto my-10 bg-base-200 shadow-xl">
<div class="card-body">
<h1 class="card-title text-2xl">Login</h1>

<form method="post" action="{% url 'accounts_signin' %}" class="py-5">
{% csrf_token %}

{% if request.GET.next %}
<input type="hidden" name="next" value="{{ request.GET.next }}">
{% endif %}
</div>

<div class="w-full my-2">
<label for="{{ form.password.id_for_label }}">Password</label>
{{ form.password }}
{% if form.password.errors %}
<div class="my-1">
<div role="alert" class="alert alert-error">
{{ form.password.errors }}
{% if form.non_field_errors %}
{% for error in form.non_field_errors %}
<div role="alert" class="alert alert-error mt-1">
<span>{{ error }}</span>
</div>
</div>
{% endfor %}
{% endif %}
</div>

<div class="card-actions mt-5">
<button class="btn btn-primary btn-block">Login</button>
</div>
</form>
<div class="w-full my-2">
<label for="{{ form.email.id_for_label }}">Email</label>
{{ form.username }}
{% if form.username.errors %}
<div class="my-1">
<div role="alert" class="alert alert-error">
{{ form.username.errors }}
</div>
</div>
{% endif %}
</div>

<div class="flex flex-col w-full">
<div class="divider divider-primary">OR</div>
</div>
<div class="w-full my-2">
<label for="{{ form.password.id_for_label }}">Password</label>
{{ form.password }}
{% if form.password.errors %}
<div class="my-1">
<div role="alert" class="alert alert-error">
{{ form.password.errors }}
</div>
</div>
{% endif %}
</div>

<div class="card-actions mt-5">
<button class="btn btn-primary btn-block">Login</button>
</div>
</form>

<div class="flex flex-col w-full">
<p>If you don't have an account, <a href="{% url 'accounts_signup' %}" class="underline underline-offset-2">create one here</a>.</p>
<div class="flex flex-col w-full">
<div class="divider divider-primary">OR</div>
</div>

<div class="flex flex-col w-full">
<p>If you don't have an account, <a href="{% url 'accounts_signup' %}"
class="underline underline-offset-2">create one here</a>.</p>
</div>
</div>
</div>
</div>
{% endblock %}
Loading

0 comments on commit c271c52

Please sign in to comment.