Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
5a7a101
feat: Add CreateForm view and route #43
DayXL Jul 24, 2024
9e4c791
feat: Add EventForm component for creating forms #43
DayXL Jul 24, 2024
c247bdd
feat: add of insert questions #43
DayXL Jul 24, 2024
ba1298e
feat: add question deletion and changed style #43
DayXL Jul 24, 2024
2529484
feat: Add question deletion functionality and update style #43
DayXL Jul 24, 2024
9402d82
feat: Add question reordering functionality and improve style #43
DayXL Jul 24, 2024
408defe
feat: reordering functionality and improve style #43
DayXL Jul 24, 2024
d7379af
Merge branch 'main' of github.com:tallysdev/eventSync into feat/issue…
tallysdev Jul 24, 2024
c6c13a9
:sparkles:feat: theme room router #42
tallysdev Jul 31, 2024
cdb271f
:sparkles:feat: theme room page and view #42
tallysdev Jul 31, 2024
3ac8395
:test: test page #42
tallysdev Jul 31, 2024
27ac422
:test: snap test #42
tallysdev Jul 31, 2024
1c9f040
Merge branch 'main' of github.com:tallysdev/eventSync into feat/issue…
tallysdev Jul 31, 2024
a4e919f
feat: init page theme room
tallysdev Aug 4, 2024
b01223c
feat: theme room table
tallysdev Aug 5, 2024
bc5d9c3
feat: init theme room in admin #42
tallysdev Aug 5, 2024
6706506
feat: urls and serializer of theme room #42
tallysdev Aug 5, 2024
fc8d0a1
feat: list and datail of theme room #42
tallysdev Aug 5, 2024
5620d92
feat: theme room migration #42
tallysdev Aug 6, 2024
3f2e7b9
merge main
tallysdev Aug 11, 2024
559e50c
Merge branch 'main' of github.com:tallysdev/eventSync into feat/issue…
tallysdev Aug 11, 2024
9f01505
git merge main
tallysdev Aug 11, 2024
6f91da1
merge main #42
tallysdev Aug 12, 2024
46daaee
tentando main #42
tallysdev Aug 12, 2024
d342e74
fix: fixing router theme room #42
tallysdev Aug 13, 2024
9d77e03
fix: models #42
tallysdev Aug 13, 2024
b04e618
fix: fixing admin theme room #42
tallysdev Aug 13, 2024
c273745
fix: fixing url #42
tallysdev Aug 13, 2024
bf23d7c
fix: fixing admin theme room #42
tallysdev Aug 13, 2024
d8926a1
Merge branch 'main' of github.com:tallysdev/eventSync into feat/issue…
tallysdev Aug 13, 2024
f790b6e
fix: teste rebase #42
tallysdev Aug 13, 2024
9c62278
chore: removing code duplication #42
tallysdev Aug 13, 2024
a5c03b3
chore: removing code duplication #42
tallysdev Aug 13, 2024
c9a369d
feat: new room fields #42
tallysdev Aug 14, 2024
3d428ff
feat: new tables #42
tallysdev Aug 14, 2024
54a93e9
package-lock.json #42
tallysdev Aug 14, 2024
18cbfc9
feat: themeRoom dto #42
tallysdev Aug 14, 2024
11d5c31
feat: new fields #42
tallysdev Aug 14, 2024
c4474d5
feat: Rename component and new folder #42
tallysdev Aug 14, 2024
944c4fe
feat: Rename component #42
tallysdev Aug 14, 2024
e5750a5
feat: api acess #42
tallysdev Aug 14, 2024
4c130e1
feat: Theme Room routers #42
tallysdev Aug 14, 2024
526f1fe
feat: Rename file themeRoomView #42
tallysdev Aug 14, 2024
43fb6e0
feat: all view #42
tallysdev Aug 14, 2024
acfdd1d
Merge branch 'main' of github.com:tallysdev/eventSync into feat/issue…
tallysdev Aug 15, 2024
3ceaf10
feat: local textfield #42
tallysdev Aug 17, 2024
7a35ee6
feat: script init rooms #42
tallysdev Aug 17, 2024
7f2d58a
feat: new migrations #42
tallysdev Aug 17, 2024
b3f0141
feat: router rooms #42
tallysdev Aug 17, 2024
7be9479
feat: init cards in list
tallysdev Aug 17, 2024
6014d48
feat: rename view files
tallysdev Aug 17, 2024
fad342b
Merge branch 'main' of github.com:tallysdev/eventSync into feat/issue…
tallysdev Aug 17, 2024
57d4e85
feat: event-based rooms #42
tallysdev Aug 18, 2024
046ea9f
feat: id as a parameter in the route #42
tallysdev Aug 18, 2024
45fa3db
feat: final form #42
tallysdev Aug 18, 2024
adb8409
feat: leaving it in just one component #42
tallysdev Aug 18, 2024
8a4687f
feat: update view and migrations #42
tallysdev Aug 18, 2024
af1e3e5
delete component file :42
tallysdev Aug 18, 2024
3e5e5b4
feat: adding button create room
tallysdev Aug 18, 2024
adc0683
fix: nao sei pq o valor nao muda para true para entrar no form
tallysdev Aug 18, 2024
cb3a494
feat: update type and validator #42
tallysdev Aug 18, 2024
bd799f8
feat: removing the id parameter on push #42
tallysdev Aug 19, 2024
dfb8820
feat: create room #42
tallysdev Aug 19, 2024
39cf104
feat: validations dates #42
tallysdev Aug 20, 2024
2dda42f
feat: post and patch in rooms #42
tallysdev Aug 20, 2024
59fd178
feat: correct router #42
tallysdev Aug 20, 2024
89cb5e3
feat: patch component #42
tallysdev Aug 20, 2024
bc4502b
feat: comment code, style and correct field name #42
tallysdev Aug 20, 2024
23226fa
feat: correct event field name and spaces between lines #42
tallysdev Aug 20, 2024
e1d129a
Merge branch 'main' of github.com:tallysdev/eventSync into feat/issue…
tallysdev Aug 20, 2024
a3b9262
feat: activate permission_classes #42
tallysdev Aug 20, 2024
6d12501
feat: add list rooms of event #42
tallysdev Aug 20, 2024
cc35e16
rename file
tallysdev Aug 20, 2024
9a64b51
feat: rename file and new form #42
tallysdev Aug 20, 2024
d2519a8
feat: add acesses token #42
tallysdev Aug 20, 2024
b913088
renames file
tallysdev Aug 20, 2024
25bf186
feat: working properly #42
tallysdev Aug 20, 2024
4f10ea7
style: revert tab #42
tallysdev Aug 20, 2024
080c686
Merge branch 'main' of github.com:tallysdev/eventSync into feat/issue…
tallysdev Aug 22, 2024
8a5143e
feat: adding theme rooms in event detail view
tallysdev Aug 22, 2024
3a838c0
feat: adding theme rooms in event detail view
tallysdev Aug 22, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from rest_framework import serializers
from core.models import ThemeRoom

class ThemeRoomSerializer(serializers.ModelSerializer):

class Meta:
model = ThemeRoom
fields = '__all__'
32 changes: 18 additions & 14 deletions backend/eventsync_api/api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,27 +8,31 @@
from .views.root_view import ApiRootView
from .views import locals_view as locv
from .views import event_view as evtview
from .views import theme_room_view as themerv
from .views import sponsor_view as spview
from .views import sponsorship_view as spsview
from .views import theme_room_view as themerv
from .views import form_view as formview
from .views import question_view as qview
from .views import registration_presence_view as rpview

urlpatterns = [
path('', ApiRootView.as_view(), name='api-root'),
path('users/', userv.UserList.as_view(), name='user_list'),
path('users/<int:pk>/', userv.UserDetail.as_view(), name='user_detail'),
path('locals/', locv.LocalListView.as_view(), name='local_list'),
path('locals/<int:pk>/', locv.LocalDetailView.as_view(), name='local_detail'),
path('events/', evtview.EventListView.as_view(), name='event_list'),
path('events/<int:pk>/', evtview.EventDetailView.as_view(), name='event_detail'),
path('sponsors/', spview.SponsorListView.as_view(), name='sponsor_list'),
path('sponsors/<int:pk>/', spview.SponsorDetailView.as_view(),
name='sponsor_detail'),
path('sponsorships/', spsview.SponsorShipListView.as_view(),
name='sponsorship_list'),
path('sponsorships/<int:pk>/',
spsview.SponsorShipDetailView.as_view(), name='sponsorship_detail'),
path('', ApiRootView.as_view(), name='api-root'),
path('users/', userv.UserList.as_view(), name='user_list'),
path('users/<int:pk>/', userv.UserDetail.as_view(), name='user_detail'),
path('locals/', locv.LocalListView.as_view(), name='local_list'),
path('locals/<int:pk>/', locv.LocalDetailView.as_view(), name='local_detail'),
path('events/', evtview.EventListView.as_view(), name='event_list'),
path('events/<int:pk>/', evtview.EventDetailView.as_view(), name='event_detail'),
path('themeRoom/', themerv.ThemeRoomListView.as_view(), name='theme_room_list'),
path('themeRoom/<int:pk>/', themerv.ThemeRoomDetailView.as_view(), name='theme_room_detail'),
path('sponsors/', spview.SponsorListView.as_view(), name='sponsor_list'),
path('sponsors/<int:pk>/', spview.SponsorDetailView.as_view(),
name='sponsor_detail'),
path('sponsorships/', spsview.SponsorShipListView.as_view(),
name='sponsorship_list'),
path('sponsorships/<int:pk>/',
spsview.SponsorShipDetailView.as_view(), name='sponsorship_detail'),
path('forms/', formview.FormsRegisterList.as_view(), name='form_list'),
path('forms/<int:pk>/', formview.FormsRegisterDetail.as_view(), name='forms_detail'),
path('questions/', qview.QuestionList.as_view(), name='question_list'),
Expand Down
169 changes: 169 additions & 0 deletions backend/eventsync_api/api/views/theme_room_view.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
from core.models import ThemeRoom, Event
from django.http import Http404
from drf_spectacular.utils import OpenApiParameter, extend_schema
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView

from ..permissions import ReadOnly
from ..serializers.theme_room_serializers import ThemeRoomSerializer
from datetime import date, datetime


class ThemeRoomListView(APIView):
"""
List all Theme Rooms for a specific Event, or create a new Theme Room for that Event.
"""
permission_classes = [IsAuthenticated | ReadOnly]

@extend_schema(
responses={200: ThemeRoomSerializer(many=True)},
parameters=[
OpenApiParameter(name='event_id', description='Event ID', required=True, type=int),

OpenApiParameter(name='page', description='Page number', required=False, type=int),

OpenApiParameter(name='page_size', description='Page size', required=False, type=int),
],
)
def get(self, request, format=None):
# Obtenha o ID do evento da query string
event_id = request.query_params.get('event_id')

if not event_id:
return Response({"detail": "Event ID is required."}, status=status.HTTP_400_BAD_REQUEST)

# Filtrar as Theme Rooms pelo evento específico
theme_rooms = ThemeRoom.objects.filter(event__id=event_id).order_by("id")

# Serializar os dados
serializer = ThemeRoomSerializer(theme_rooms, many=True)

return Response(serializer.data)

@extend_schema(
request=ThemeRoomSerializer,

responses={201: ThemeRoomSerializer},
)
def post(self, request, format=None):
# Obtenha o ID do evento do corpo da requisição
event_id = request.data.get('event')

# if not event_id:
# return Response({"detail": "Event ID is required."}, status=status.HTTP_400_BAD_REQUEST)

try:
# Busque o evento pelo ID
event = Event.objects.get(id=event_id)

except Event.DoesNotExist:

return Response({"detail": "Event not found."}, status=status.HTTP_404_NOT_FOUND)

# Obtenha as datas do evento
# event_start_date = event.start_date

# event_end_date = event.end_date

# # Obtenha a data de início e fim da Theme Room
# theme_room_start_date = request.data.get('start_date')

# theme_room_end_date = request.data.get('end_date')

# # Valide se as datas da Theme Room estão dentro do intervalo do evento
# if theme_room_start_date and theme_room_end_date:

# # Converta as datas para objetos date, se necessário
# theme_room_start_date = date.fromisoformat(theme_room_start_date)

# theme_room_end_date = date.fromisoformat(theme_room_end_date)

# if theme_room_start_date < event_start_date or theme_room_end_date > event_end_date:
# return Response(
# {"detail": "Theme room dates must be within the event's date range."},
# status=status.HTTP_400_BAD_REQUEST,
# )

# # Serializar e salvar os dados
serializer = ThemeRoomSerializer(data=request.data)

if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)

return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class ThemeRoomDetailView(APIView):
"""
Retrieve, update or delete a Theme Room.
"""
permission_classes = [IsAuthenticated | ReadOnly]

def get_object(self, pk):
try:
return ThemeRoom.objects.get(pk=pk)

except ThemeRoom.DoesNotExist:
raise Http404

@extend_schema(
responses={200: ThemeRoomSerializer},
)
def get(self, request, pk, format=None):
themeRoom = self.get_object(pk)
serializer = ThemeRoomSerializer(themeRoom)
return Response(serializer.data)


@extend_schema(
request=ThemeRoomSerializer,
responses={200: ThemeRoomSerializer},
)
def patch(self, request, pk, format=None):
themeRoom = self.get_object(pk)

# Obtenha o evento associado a esta Theme Room
event = themeRoom.event

# Obtenha as datas do evento
event_start_date = event.start_date

event_end_date = event.end_date

# Obtenha a data de início e fim da Theme Room do request
theme_room_start_date = request.data.get('start_date', themeRoom.start_date)

theme_room_end_date = request.data.get('end_date', themeRoom.end_date)

# Valide se as novas datas da Theme Room estão dentro do intervalo do evento
if theme_room_start_date and theme_room_end_date:
# Converta as datas para objetos date, se necessário
theme_room_start_date = date.fromisoformat(theme_room_start_date) if isinstance(theme_room_start_date, str) else theme_room_start_date

theme_room_end_date = date.fromisoformat(theme_room_end_date) if isinstance(theme_room_end_date, str) else theme_room_end_date

if theme_room_start_date < event_start_date or theme_room_end_date > event_end_date:
return Response(
{"detail": "Theme room dates must be within the event's date range."},
status=status.HTTP_400_BAD_REQUEST,
)

# Atualize a Theme Room com os dados do request
serializer = ThemeRoomSerializer(themeRoom, data=request.data, partial=True)

if serializer.is_valid():
serializer.save()
return Response(serializer.data)

return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

@extend_schema(
responses={204: None},
)
def delete(self, request, pk, format=None):
themeRoom = self.get_object(pk)
themeRoom.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
9 changes: 7 additions & 2 deletions backend/eventsync_api/core/admin.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.utils.translation import gettext_lazy as _
from .models import ESUser, Local, Event, Sponsor, Sponsorship, RegistrationPresence
from .models import ESUser, Local, Event, Sponsor, Sponsorship, RegistrationPresence, ThemeRoom
from .forms import CustomUserCreationForm, CustomUserChangeForm


Expand Down Expand Up @@ -47,13 +47,18 @@ class EventAdmin(admin.ModelAdmin):
search_fields = ('name', 'description')
date_hierarchy = 'start_date'

@admin.register(ThemeRoom)
class ThemeRoomAdmin(admin.ModelAdmin):
list_display = ('event', 'start_time', 'name', 'start_date', 'end_date', 'local', 'status', 'event_type')
list_filter = ('status', 'event_type', 'local')
search_fields = ('name', 'description',)
date_hierarchy = 'start_date'

@admin.register(Sponsor)
class SponsorAdmin(admin.ModelAdmin):
list_display = ('name', 'phone', 'email')
search_fields = ('name', 'phone', 'email')


@admin.register(Sponsorship)
class SponsorshipAdmin(admin.ModelAdmin):
list_display = ('event', 'sponsor')
Expand Down
41 changes: 41 additions & 0 deletions backend/eventsync_api/core/management/commands/initrooms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import random
from datetime import datetime, timedelta

from django.core.management.base import BaseCommand
from django.utils import timezone

from core.models import ThemeRoom, Event

class Command(BaseCommand):
help = 'Create 5 Local and 20 Event records for testing'

def handle(self, *args, **kwargs):
# Criar 5 Locais

# Criar 20 Eventos
event_statuses = ['upcoming', 'ongoing', 'completed', 'cancelled']
event_types = ['conference', 'workshop', 'seminar', 'meetup']

for i in range(20):
start_date = timezone.now().date() + timedelta(days=random.randint(1, 30))
end_date = start_date + timedelta(days=random.randint(1, 5))
start_time= timezone.now()

ThemeRoom.objects.create(
event = Event.objects.get(pk=1),
name=f'Sala Tematica {i+1}',
speaker=f'Palestrante {i+1}',
start_date=start_date,
end_date=end_date,
start_time=start_time,
max_quantity=random.randint(10, 100),
min_quantity=random.randint(1, 10),
hours_quantity=random.randint(1, 8),
description=f'Descrição da Sala {i+1}',
local=f'Bloco A, Sala A34',
audiences='Alunos',
status=random.choice(event_statuses),
event_type=random.choice(event_types)
)

self.stdout.write(self.style.SUCCESS('Successfully 20 rooms in your dev database event 1'))
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
# Generated by Django 5.0.4 on 2024-08-18 17:36

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


class Migration(migrations.Migration):

dependencies = [
('core', '0005_event'),
]

operations = [
migrations.CreateModel(
name='Sponsor',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100)),
('logo', models.ImageField(blank=True, null=True, upload_to='logos/')),
('phone', models.CharField(max_length=11, validators=[django.core.validators.RegexValidator(message='Phone number must be 11 digits.', regex='^\\d{11}$')])),
('email', models.EmailField(max_length=254, unique=True, verbose_name='email address')),
('description', models.TextField()),
],
options={
'verbose_name': 'Sponsor',
'verbose_name_plural': 'Sponsors',
'ordering': ['id'],
},
),
migrations.CreateModel(
name='FormsRegister',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=150)),
('description', models.TextField()),
('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.event')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'Form',
'verbose_name_plural': 'Forms',
'ordering': ['id'],
},
),
migrations.CreateModel(
name='Question',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('text', models.TextField()),
('type', models.CharField(choices=[('Discursiva', 'Discursiva'), ('Múltipla escolha', 'Múltipla escolha'), ('Objetiva', 'Objetiva')], default='Discursiva', max_length=20)),
('options', models.JSONField(blank=True, default=list)),
('form', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.formsregister')),
],
options={
'verbose_name': 'Question',
'verbose_name_plural': 'Questions',
'ordering': ['id'],
},
),
migrations.CreateModel(
name='Sponsorship',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.event')),
('sponsor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.sponsor')),
],
options={
'verbose_name': 'Sponsor',
'verbose_name_plural': 'Sponsors',
'ordering': ['id'],
},
),
migrations.CreateModel(
name='ThemeRoom',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('start_date', models.DateField()),
('end_date', models.DateField()),
('start_time', models.TimeField()),
('speaker', models.CharField(max_length=100)),
('name', models.CharField(max_length=150)),
('description', models.TextField()),
('hours_quantity', models.IntegerField()),
('audiences', models.TextField()),
('max_quantity', models.IntegerField()),
('min_quantity', models.IntegerField()),
('local', models.TextField()),
('status', models.CharField(choices=[('upcoming', 'Upcoming'), ('ongoing', 'Ongoing'), ('completed', 'Completed'), ('cancelled', 'Cancelled')], default='upcoming', max_length=20)),
('event_type', models.CharField(choices=[('conference', 'Conference'), ('workshop', 'Workshop'), ('seminar', 'Seminar'), ('meetup', 'Meetup')], default='conference', max_length=20)),
('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.event')),
],
options={
'verbose_name': 'Theme Room',
'verbose_name_plural': 'Theme Rooms',
'ordering': ['id'],
},
),
]
Loading