136 lines
4.5 KiB
Python
136 lines
4.5 KiB
Python
import os
|
|
import platform
|
|
import json
|
|
|
|
from django import get_version as django_version
|
|
from django.shortcuts import render, redirect
|
|
from django.urls import reverse_lazy
|
|
from django.utils import timezone
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.http import JsonResponse
|
|
from django.views.generic import TemplateView, FormView, CreateView
|
|
from django_pandas.io import read_frame
|
|
from django.contrib import messages
|
|
|
|
from .forms import MoodEntryForm, ContactForm, SignUpForm, DateRangeFilterForm
|
|
from .models import MoodEntry, Activity
|
|
from .mail import send_contact_message
|
|
|
|
|
|
class SignUpView(CreateView):
|
|
form_class = SignUpForm
|
|
success_url = reverse_lazy('login')
|
|
template_name = 'registration/signup.html'
|
|
|
|
|
|
class AboutView(TemplateView):
|
|
template_name = "core/about.html"
|
|
|
|
|
|
class ContactView(FormView):
|
|
template_name = "core/contact.html"
|
|
form_class = ContactForm
|
|
success_url = reverse_lazy('core:contact')
|
|
|
|
def form_valid(self, form):
|
|
name = form.cleaned_data['name']
|
|
email = form.cleaned_data['email']
|
|
message = form.cleaned_data['message']
|
|
|
|
# Send email
|
|
email_sent = send_contact_message(name, email, message)
|
|
|
|
if email_sent:
|
|
messages.success(self.request, 'Thank you for your message! We will get back to you shortly.')
|
|
else:
|
|
messages.error(self.request, 'Sorry, there was an error sending your message. Please try again later.')
|
|
|
|
return super().form_valid(form)
|
|
|
|
|
|
class PrivacyPolicyView(TemplateView):
|
|
template_name = "core/privacy_policy.html"
|
|
|
|
|
|
def home(request):
|
|
"""Render the home page with mood entries."""
|
|
context = {
|
|
'project_name': "PixelMinds",
|
|
}
|
|
if request.user.is_authenticated:
|
|
mood_entries = MoodEntry.objects.filter(user=request.user).order_by('-date_time')[:7]
|
|
context['mood_entries'] = mood_entries
|
|
activities = Activity.objects.all()
|
|
context['activities'] = activities
|
|
|
|
return render(request, "core/index.html", context)
|
|
|
|
|
|
@login_required
|
|
def dashboard(request):
|
|
mood_entries = MoodEntry.objects.filter(user=request.user).order_by('date_time')
|
|
form = DateRangeFilterForm(request.GET)
|
|
if form.is_valid():
|
|
start_date = form.cleaned_data.get('start_date')
|
|
end_date = form.cleaned_data.get('end_date')
|
|
if start_date:
|
|
mood_entries = mood_entries.filter(date_time__gte=start_date)
|
|
if end_date:
|
|
mood_entries = mood_entries.filter(date_time__lte=end_date)
|
|
|
|
df = read_frame(mood_entries, fieldnames=['date_time', 'mood_score'])
|
|
if not df.empty:
|
|
df['date_time'] = df['date_time'].dt.strftime('%Y-%m-%d')
|
|
chart_data = df.to_json(orient='records')
|
|
return render(request, 'core/dashboard.html', {'chart_data': chart_data, 'form': form})
|
|
|
|
|
|
@login_required
|
|
def create_mood_entry(request):
|
|
if request.method == 'POST':
|
|
form = MoodEntryForm(request.POST)
|
|
if form.is_valid():
|
|
mood_entry = form.save(commit=False)
|
|
mood_entry.user = request.user
|
|
|
|
# Assign color based on mood score
|
|
mood_score = form.cleaned_data['mood_score']
|
|
if mood_score == 1:
|
|
mood_entry.color_code = '#FF0000' # Red
|
|
elif mood_score == 2:
|
|
mood_entry.color_code = '#FFC107' # Amber
|
|
elif mood_score == 3:
|
|
mood_entry.color_code = '#FFFF00' # Yellow
|
|
elif mood_score == 4:
|
|
mood_entry.color_code = '#4CAF50' # Green
|
|
elif mood_score == 5:
|
|
mood_entry.color_code = '#2196F3' # Blue
|
|
|
|
mood_entry.save()
|
|
form.save_m2m() # Save the many-to-many relationships
|
|
return redirect('core:index')
|
|
else:
|
|
form = MoodEntryForm()
|
|
|
|
return render(request, 'core/mood_entry_form.html', {'form': form})
|
|
|
|
@login_required
|
|
def save_mood_entry(request):
|
|
if request.method == 'POST':
|
|
data = json.loads(request.body)
|
|
mood_score = data.get('mood_score')
|
|
activity_ids = data.get('activity_ids')
|
|
|
|
mood_entry = MoodEntry.objects.create(
|
|
user=request.user,
|
|
mood_score=mood_score
|
|
)
|
|
|
|
if activity_ids:
|
|
activities = Activity.objects.filter(id__in=activity_ids)
|
|
mood_entry.activities.set(activities)
|
|
|
|
return JsonResponse({'status': 'success'})
|
|
return JsonResponse({'status': 'error'}, status=400)
|
|
|