pre release 20240903

This commit is contained in:
hayano
2024-09-03 13:19:30 +00:00
parent 80ccaace3d
commit 6f0d8d15fd
7 changed files with 229 additions and 5 deletions

View File

@ -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)