Skip to content

Commit

Permalink
Merge pull request #21 from HE-Arc/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
lugopi committed May 2, 2024
2 parents bdbfa3e + 6c1d295 commit f7d467b
Show file tree
Hide file tree
Showing 55 changed files with 1,649 additions and 490 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -167,3 +167,4 @@ frontend/package-lock.lock
.vscode/

backend/pictures
backend/schema.yml
37 changes: 36 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,39 @@
![App logo](https://github.com/HE-Arc/kodecupid/blob/main/identity/logo1024.png)
```> [SUCCESS] New connection established !```

KodeCupid is a dating app for developers and computer scientists. It helps users to find their significant other based on computer-related filters, such as prefered programming languages.
*KodeCupid Dating App*
=====================

Welcome to KodeCupid, a dating app for developers and computer scientists. Our goal is to help you find your significant other based on computer-related filters, such as preferred programming languages.

**Requirements to Begin Development**
------------------------------------

* Docker
* Docker Compose

**Installation and Run**
-------------------------

Clone the repository:
```bash
git clone [email protected]:HE-Arc/kodecupid.git
cd kodecupid
```

Disable auto-crlf on Windows (some scripts will be executed on Linux):
```bash
git config --local core.autocrlf false
```

Copy the .env.example file and update it with your environment variables.
Launch the Docker container:
```bash
docker compose up
```

# Accessing the App

The KodeCupid app can be accessed on:
* localhost:80 (web interface)
* localhost:8000 (API)
1 change: 1 addition & 0 deletions backend/Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ djangorestframework = "3.14.0"
django-cors-headers = "4.3.1"
pillow="10.2.0"
djangorestframework-simplejwt="5.3.1"
drf-spectacular = "0.27.2"

[dev-packages]
black = "24.2.0"
Expand Down
12 changes: 12 additions & 0 deletions backend/kodecupid/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
'corsheaders',
"kodecupidapp",
"rest_framework",
'drf_spectacular',
]

REST_FRAMEWORK = {
Expand All @@ -57,6 +58,7 @@
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
}

MIDDLEWARE = [
Expand Down Expand Up @@ -88,6 +90,16 @@
},
]

SPECTACULAR_SETTINGS = {
'TITLE': 'KodeCupid API',
'DESCRIPTION': 'KodeCupid API Documentation',
'VERSION': '1.0.0',
'SERVE_INCLUDE_SCHEMA': False,
}

MEDIA_URL = '/files/'
MEDIA_ROOT = BASE_DIR

WSGI_APPLICATION = 'kodecupid.wsgi.application'

# Database
Expand Down
39 changes: 32 additions & 7 deletions backend/kodecupid/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,45 @@
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from kodecupidapp.views import UserView, TagView, PictureView, LikeView, UserTagView
from django.urls import path, include

from rest_framework import routers

from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView

from kodecupidapp.views import (
UserView,
TagView,
PictureView,
LikeView,
SwipeView,
MessageView,
)

from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)

base_url = 'api/'

router = routers.DefaultRouter()
router.register('users', UserView, basename='user')
router.register('tags', TagView, basename='tag')
router.register('pictures', PictureView, basename='picture')
router.register('messages', MessageView, basename='message')
router.register('likes', LikeView, basename='like')
router.register('swipes', SwipeView, basename='swipe')

urlpatterns = [

path('admin/', admin.site.urls),

path('api/schema/', SpectacularAPIView.as_view(), name='schema'),
path('api/', SpectacularSwaggerView.as_view(url_name='schema'), name='docs'),

path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
path('api/user/', UserView.as_view(), name='user'),
path('api/picture/', PictureView.as_view(), name='picture'),
path('api/tags/', TagView.as_view(), name='tag-list'),
path('api/like/', LikeView.as_view(), name='like-create'),
path('api/user/tags', UserTagView.as_view(), name='user-tag')

path(base_url, include(router.urls)),
]
11 changes: 11 additions & 0 deletions backend/kodecupidapp/management/commands/Pipfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]

[dev-packages]

[requires]
python_version = "3.11"
22 changes: 22 additions & 0 deletions backend/kodecupidapp/migrations/0004_remove_tag_users_user_tags.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Generated by Django 5.0.4 on 2024-04-03 22:20

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('kodecupidapp', '0003_like_unique_like'),
]

operations = [
migrations.RemoveField(
model_name='tag',
name='users',
),
migrations.AddField(
model_name='user',
name='tags',
field=models.ManyToManyField(related_name='tags', to='kodecupidapp.tag'),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Generated by Django 5.0.4 on 2024-04-28 19:04

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('kodecupidapp', '0004_remove_tag_users_user_tags'),
]

operations = [
migrations.AddField(
model_name='user',
name='sex',
field=models.BooleanField(default=True),
preserve_default=False,
),
migrations.AlterField(
model_name='user',
name='looking_for',
field=models.BooleanField(),
),
]
17 changes: 17 additions & 0 deletions backend/kodecupidapp/migrations/0006_remove_user_looking_for.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 5.0.4 on 2024-04-28 20:14

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('kodecupidapp', '0005_user_sex_alter_user_looking_for'),
]

operations = [
migrations.RemoveField(
model_name='user',
name='looking_for',
),
]
19 changes: 19 additions & 0 deletions backend/kodecupidapp/migrations/0007_user_looking_for.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 5.0.4 on 2024-04-28 20:14

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('kodecupidapp', '0006_remove_user_looking_for'),
]

operations = [
migrations.AddField(
model_name='user',
name='looking_for',
field=models.BooleanField(default=False),
preserve_default=False,
),
]
25 changes: 25 additions & 0 deletions backend/kodecupidapp/migrations/0008_message.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Generated by Django 5.0.4 on 2024-04-26 09:16

import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('kodecupidapp', '0007_user_looking_for'),
]

operations = [
migrations.CreateModel(
name='Message',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('sent', models.DateTimeField(auto_now_add=True)),
('content', models.TextField()),
('source_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='message_source_user', to=settings.AUTH_USER_MODEL)),
('target_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='message_target_user', to=settings.AUTH_USER_MODEL)),
],
),
]
19 changes: 19 additions & 0 deletions backend/kodecupidapp/migrations/0009_alter_user_pfp.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 5.0.4 on 2024-05-01 10:15

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('kodecupidapp', '0008_message'),
]

operations = [
migrations.AlterField(
model_name='user',
name='pfp',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='pfp', to='kodecupidapp.picture'),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 5.0.4 on 2024-05-01 15:31

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('kodecupidapp', '0009_alter_user_pfp'),
]

operations = [
migrations.AlterField(
model_name='message',
name='content',
field=models.TextField(max_length=255),
),
migrations.AlterField(
model_name='user',
name='bio',
field=models.CharField(max_length=255),
),
]
3 changes: 2 additions & 1 deletion backend/kodecupidapp/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from .tag import Tag
from .user import User
from .picture import Picture
from .like import Like
from .like import Like
from .message import Message
8 changes: 8 additions & 0 deletions backend/kodecupidapp/models/message.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from django.db import models
from .user import User

class Message(models.Model):
source_user = models.ForeignKey(User, related_name='message_source_user', on_delete=models.CASCADE)
target_user = models.ForeignKey(User, related_name='message_target_user', on_delete=models.CASCADE)
sent = models.DateTimeField(auto_now_add=True)
content = models.TextField(max_length=255)
1 change: 0 additions & 1 deletion backend/kodecupidapp/models/tag.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,5 @@

class Tag(models.Model):
name = models.CharField(max_length=100)
users = models.ManyToManyField('kodecupidapp.User', related_name='tags')
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
8 changes: 5 additions & 3 deletions backend/kodecupidapp/models/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

class User(AbstractUser):
# Add additional fields
bio = models.CharField(max_length=100)
looking_for = models.CharField(max_length=100)
pfp = models.ForeignKey(Picture, related_name='pfp', on_delete=models.CASCADE, null=True, blank=True)
bio = models.CharField(max_length=255)
sex = models.BooleanField()
looking_for = models.BooleanField()
tags = models.ManyToManyField('kodecupidapp.Tag', related_name='tags')
pfp = models.ForeignKey(Picture, related_name='pfp', on_delete=models.SET_NULL, null=True, blank=True)
3 changes: 2 additions & 1 deletion backend/kodecupidapp/serializers/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from .user import UserSerializer, UserRegistrationSerializer, UserConfigurationSerializer
from .tag import TagSerializer
from .picture import PictureSerializer
from .like import LikeSerializer
from .like import LikeSerializer
from .message import MessageSerializer
3 changes: 3 additions & 0 deletions backend/kodecupidapp/serializers/like.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ def validate(self, attrs):
user = self.context['request'].user
target_user = attrs['target_user']

if(user == target_user):
raise ValidationError("You sure you like yourself this much? Liking yourself isn't allowed here.")

if Like.objects.filter(source_user=user, target_user=target_user).exists():
raise ValidationError('You have already liked this user.')

Expand Down
28 changes: 28 additions & 0 deletions backend/kodecupidapp/serializers/message.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from ..models import Message, User, Like

class MessageSerializer(serializers.ModelSerializer):
target_user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), write_only=True )# ,source='target_user')

class Meta:
model = Message
fields = ['id', 'source_user', 'target_user', 'sent', 'content']
read_only_fields = ['id', 'source_user', 'sent']

def validate(self, attrs):
source_user = self.context['request'].user
target_user = attrs['target_user']

userLikedMe = Like.objects.filter(source_user=target_user, target_user=source_user).exists()
iLikedUser = Like.objects.filter(source_user=source_user, target_user=target_user).exists()

if not userLikedMe or not iLikedUser:
raise ValidationError('Messages can only be sent to users when a match occured.')

return attrs

def create(self, validated_data):
user = self.context['request'].user
validated_data['source_user'] = user
return Message.objects.create(**validated_data)
Loading

0 comments on commit f7d467b

Please sign in to comment.