pre release 20240903
This commit is contained in:
131
rog/views.py
131
rog/views.py
@ -70,9 +70,127 @@ from django.contrib.gis.geos import Point
|
||||
from django.contrib.gis.db.models.functions import Distance
|
||||
|
||||
from django.utils.dateparse import parse_date
|
||||
from django.utils import timezone
|
||||
|
||||
import csv
|
||||
import io
|
||||
from django.contrib import admin
|
||||
from django.shortcuts import render
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.urls import path
|
||||
from django import forms
|
||||
from .models import NewEvent2, CustomUser, Team, NewCategory, Entry, Member, TempUser
|
||||
from django.core.mail import send_mail
|
||||
from django.conf import settings
|
||||
from django.db import transaction
|
||||
from django.core.exceptions import ValidationError
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
def process_csv_upload(csv_file, event):
|
||||
decoded_file = csv_file.read().decode('utf-8')
|
||||
io_string = io.StringIO(decoded_file)
|
||||
reader = csv.reader(io_string)
|
||||
next(reader) # ヘッダーをスキップ
|
||||
|
||||
for row in reader:
|
||||
try:
|
||||
owner_email, owner_name, owner_grade, owner_gender, team_name, category_name, *member_data = row
|
||||
# ここでデータを処理し、必要なオブジェクトを作成します
|
||||
# 例: create_or_update_team(owner_email, owner_name, owner_grade, owner_gender, team_name, category_name, event)
|
||||
# 例: process_members(member_data, team)
|
||||
except ValidationError as e:
|
||||
# エラーハンドリング
|
||||
pass
|
||||
|
||||
|
||||
class CSVUploadForm(forms.Form):
|
||||
event = forms.ModelChoiceField(queryset=NewEvent2.objects.all())
|
||||
csv_file = forms.FileField()
|
||||
|
||||
class NewEvent2Admin(admin.ModelAdmin):
|
||||
list_display = ['event_name', 'start_datetime', 'end_datetime']
|
||||
|
||||
def get_urls(self):
|
||||
urls = super().get_urls()
|
||||
my_urls = [
|
||||
path('csv-upload/', self.admin_site.admin_view(self.csv_upload_view), name='csv-upload'),
|
||||
]
|
||||
return my_urls + urls
|
||||
|
||||
def csv_upload_view(self, request):
|
||||
if request.method == 'POST':
|
||||
form = CSVUploadForm(request.POST, request.FILES)
|
||||
if form.is_valid():
|
||||
event = form.cleaned_data['event']
|
||||
csv_file = request.FILES['csv_file']
|
||||
csv_data = csv_file.read().decode('utf-8')
|
||||
csv_reader = csv.reader(io.StringIO(csv_data))
|
||||
next(csv_reader) # ヘッダーをスキップ
|
||||
|
||||
for row in csv_reader:
|
||||
self.process_team(event, row)
|
||||
|
||||
self.message_user(request, "CSV file has been processed successfully.")
|
||||
return HttpResponseRedirect("..")
|
||||
else:
|
||||
form = CSVUploadForm()
|
||||
|
||||
context = {
|
||||
'form': form,
|
||||
'title': 'Upload CSV file',
|
||||
}
|
||||
return render(request, 'admin/csv_upload.html', context)
|
||||
|
||||
@transaction.atomic
|
||||
def process_team(self, event, row):
|
||||
owner_data = row[:4]
|
||||
team_name = row[4]
|
||||
category_name = row[5]
|
||||
members_data = row[6:]
|
||||
|
||||
owner = self.create_or_get_user(*owner_data)
|
||||
category = NewCategory.objects.get(category_name=category_name)
|
||||
team, _ = Team.objects.get_or_create(owner=owner, team_name=team_name, category=category)
|
||||
|
||||
entry, _ = Entry.objects.get_or_create(
|
||||
team=team,
|
||||
event=event,
|
||||
category=category,
|
||||
owner=owner,
|
||||
date=event.start_datetime.date()
|
||||
)
|
||||
|
||||
for i in range(0, len(members_data), 4):
|
||||
member_data = members_data[i:i+4]
|
||||
if member_data[0]: # メールアドレスがある場合のみ処理
|
||||
member = self.create_or_get_user(*member_data)
|
||||
Member.objects.get_or_create(team=team, user=member)
|
||||
|
||||
def create_or_get_user(self, email, name, grade, gender):
|
||||
is_dummy = False
|
||||
if not email:
|
||||
email = f"dummy_{uuid.uuid4()}@example.com"
|
||||
is_dummy = True
|
||||
|
||||
user, created = CustomUser.objects.get_or_create(email=email)
|
||||
if created or is_dummy:
|
||||
user.firstname, user.lastname = name.split(' ', 1) if ' ' in name else (name, '')
|
||||
user.grade = grade
|
||||
user.gender = gender
|
||||
user.is_active = not is_dummy
|
||||
user.save()
|
||||
|
||||
if not is_dummy:
|
||||
self.send_invitation_email(user)
|
||||
|
||||
return user
|
||||
|
||||
def send_invitation_email(self, user):
|
||||
subject = 'Invitation to join the event'
|
||||
message = f'Please click the following link to activate your account: {settings.SITE_URL}/activate/{user.id}/'
|
||||
send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [user.email])
|
||||
|
||||
|
||||
class LocationViewSet(viewsets.ModelViewSet):
|
||||
queryset=Location.objects.all()
|
||||
@ -1060,12 +1178,12 @@ class RegistrationView(APIView):
|
||||
class NewEvent2ViewSet(viewsets.ModelViewSet):
|
||||
queryset = NewEvent2.objects.all()
|
||||
serializer_class = NewEvent2Serializer
|
||||
permission_classes = [IsAuthenticated]
|
||||
permission_classes = [permissions.IsAuthenticated]
|
||||
|
||||
class NewEvent2ListView(generics.ListAPIView):
|
||||
queryset = NewEvent2.objects.all()
|
||||
serializer_class = NewEvent2Serializer
|
||||
permission_classes = [IsAuthenticated]
|
||||
permission_classes = [permissions.IsAuthenticated]
|
||||
|
||||
class NewEventViewSet(viewsets.ModelViewSet):
|
||||
queryset = NewEvent.objects.all()
|
||||
@ -1370,6 +1488,15 @@ class EntryViewSet(viewsets.ModelViewSet):
|
||||
def create(self, request, *args, **kwargs):
|
||||
serializer = self.get_serializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
|
||||
# イベントの締め切り日時をチェック
|
||||
event = serializer.validated_data['event']
|
||||
if event.deadlineDateTime and timezone.now() > event.deadlineDateTime:
|
||||
return Response(
|
||||
{"error": "締め切りを過ぎているため、エントリーを作成できません。"},
|
||||
status=status.HTTP_400_BAD_REQUEST
|
||||
)
|
||||
|
||||
try:
|
||||
self.perform_create(serializer)
|
||||
headers = self.get_success_headers(serializer.data)
|
||||
|
||||
Reference in New Issue
Block a user