Skip to content

Commit 64d8b7c

Browse files
Merge pull request #42 from HackAssistant/friends
friends join and create form
2 parents 0b01a9d + 17e9592 commit 64d8b7c

File tree

13 files changed

+154
-0
lines changed

13 files changed

+154
-0
lines changed

app/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
'user',
6262
'application',
6363
'review',
64+
'friends',
6465
'event',
6566
'axes',
6667
]

app/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
path('auth/', include('user.urls')),
3030
path('application/', include('application.urls')),
3131
path('review/', include('review.urls')),
32+
path('friends/', include('friends.urls')),
3233
path('event/', include('event.urls')),
3334
]
3435

friends/__init__.py

Whitespace-only changes.

friends/admin.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.contrib import admin
2+
3+
from friends.models import FriendsCode
4+
5+
admin.site.register(FriendsCode)

friends/apps.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.apps import AppConfig
2+
3+
4+
class FriendsConfig(AppConfig):
5+
default_auto_field = 'django.db.models.BigAutoField'
6+
name = 'friends'

friends/forms.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from django import forms
2+
from django.conf import settings
3+
from django.utils.translation import gettext_lazy as _
4+
5+
from app.mixins import BootstrapFormMixin
6+
7+
8+
class FriendsForm(BootstrapFormMixin, forms.Form):
9+
bootstrap_field_info = {'': {'fields': [{'name': 'friends_code', 'space': 12}, ]}}
10+
11+
friends_code = forms.CharField(label=_('Friends\' code'), max_length=getattr(settings, "FRIEND_CODE_LENGTH", 13),
12+
required=False)

friends/migrations/0001_initial.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Generated by Django 4.0.6 on 2022-08-16 16:33
2+
3+
from django.conf import settings
4+
from django.db import migrations, models
5+
import django.db.models.deletion
6+
import friends.models
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
initial = True
12+
13+
dependencies = [
14+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
15+
]
16+
17+
operations = [
18+
migrations.CreateModel(
19+
name='FriendCode',
20+
fields=[
21+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
22+
('code', models.CharField(default=friends.models.get_random_string, max_length=13)),
23+
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
24+
],
25+
),
26+
]
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Generated by Django 4.0.6 on 2022-08-16 16:43
2+
3+
from django.conf import settings
4+
from django.db import migrations
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
11+
('friends', '0001_initial'),
12+
]
13+
14+
operations = [
15+
migrations.RenameModel(
16+
old_name='FriendCode',
17+
new_name='FriendsCode',
18+
),
19+
]

friends/migrations/__init__.py

Whitespace-only changes.

friends/models.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import random
2+
import string
3+
4+
from django.conf import settings
5+
from django.db import models
6+
7+
8+
def get_random_string():
9+
# With combination of lower, upper case and numbers
10+
characters = string.ascii_letters + string.digits
11+
code_length = getattr(settings, "FRIEND_CODE_LENGTH", 13)
12+
return ''.join(random.choice(characters) for _ in range(code_length))
13+
14+
15+
class FriendsCode(models.Model):
16+
code = models.CharField(default=get_random_string, max_length=getattr(settings, "FRIEND_CODE_LENGTH", 13))
17+
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

friends/templates/join_friends.html

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{% extends 'base.html' %}
2+
{% load i18n %}
3+
{% block subtitle %}{% translate "Friends' group" %}{% endblock %}
4+
{% block content %}
5+
<h1>{% translate "Friends' group" %}</h1>
6+
<form method="post" id="invite-form">
7+
{% csrf_token %}
8+
{% include 'components/bootstrap5_form.html' with form=friends_form %}
9+
<div class="d-grid gap-2 col-lg-6 mx-auto mt-2">
10+
<button class="btn btn-primary" name="action" value="join">{% translate 'Join' %}</button>
11+
<button class="btn btn-secondary" name="action" value="create">{% translate 'Create' %}</button>
12+
</div>
13+
</form>
14+
{% endblock %}

friends/urls.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from django.urls import path
2+
3+
from friends import views
4+
5+
urlpatterns = [
6+
path('', views.JoinFriendsView.as_view(), name='join_friends'),
7+
]

friends/views.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from django.http import HttpResponseBadRequest
2+
from django.shortcuts import redirect
3+
from django.urls import reverse
4+
from django.views.generic import TemplateView
5+
6+
from friends.forms import FriendsForm
7+
from friends.models import FriendsCode
8+
9+
10+
class JoinFriendsView(TemplateView):
11+
template_name = "join_friends.html"
12+
13+
def get_context_data(self, **kwargs):
14+
context = super().get_context_data(**kwargs)
15+
try:
16+
friends_code = FriendsCode.objects.get(user=self.request.user)
17+
context.update({"friends_code": friends_code})
18+
except FriendsCode.DoesNotExist:
19+
context.update({"friends_form": FriendsForm()})
20+
return context
21+
22+
def post(self, request, **kwargs):
23+
action = request.POST.get("action")
24+
if action not in ["create", "join"]:
25+
return HttpResponseBadRequest()
26+
method = getattr(self, action)
27+
return method()
28+
29+
def create(self, **kwargs):
30+
default = {"user": self.request.user}
31+
code = kwargs.get("code", None)
32+
if code is not None:
33+
default["code"] = code
34+
FriendsCode(**default).save()
35+
return redirect(reverse("join_friends"))
36+
37+
def join(self, **kwargs):
38+
form = FriendsForm(self.request.POST)
39+
if form.is_valid():
40+
code = form.cleaned_data.get("friends_code", None)
41+
if code is not None and FriendsCode.objects.filter(code=code).exists():
42+
return self.create(code=code)
43+
form.add_error("friends_code", "Invalid code!")
44+
context = self.get_context_data()
45+
context.update({"friends_form": form})
46+
return self.render_to_response(context)

0 commit comments

Comments
 (0)