37123-vm/core/views.py
Flatlogic Bot 0443b0e2cb mh4
2025-12-22 20:10:27 +00:00

255 lines
8.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.contrib.auth.mixins import LoginRequiredMixin
from django.http import JsonResponse
from django.views.generic import TemplateView, FormView, CreateView, ListView, DetailView, UpdateView, DeleteView
from django.db import models
from .forms import MoodEntryForm, ContactForm, SignUpForm, DateRangeFilterForm
from .models import MoodEntry, Activity, Note, Mission
from .mail import send_contact_message
from ai.local_ai_api import LocalAIApi
class MissionListView(LoginRequiredMixin, ListView):
model = Mission
template_name = 'core/mission_list.html'
context_object_name = 'missions'
def get_queryset(self):
return Mission.objects.filter(user=self.request.user).order_by('-is_active', '-created_at')
class MissionDetailView(LoginRequiredMixin, DetailView):
model = Mission
template_name = 'core/mission_detail.html'
context_object_name = 'mission'
def get_queryset(self):
return Mission.objects.filter(user=self.request.user)
class MissionCreateView(LoginRequiredMixin, CreateView):
model = Mission
template_name = 'core/mission_form.html'
fields = ['title', 'description', 'is_active']
success_url = reverse_lazy('core:mission_list')
def form_valid(self, form):
form.instance.user = self.request.user
return super().form_valid(form)
class MissionUpdateView(LoginRequiredMixin, UpdateView):
model = Mission
template_name = 'core/mission_form.html'
fields = ['title', 'description', 'is_active']
success_url = reverse_lazy('core:mission_list')
def get_queryset(self):
return Mission.objects.filter(user=self.request.user)
class MissionDeleteView(LoginRequiredMixin, DeleteView):
model = Mission
template_name = 'core/mission_confirm_delete.html'
success_url = reverse_lazy('core:mission_list')
def get_queryset(self):
return Mission.objects.filter(user=self.request.user)
class NoteListView(LoginRequiredMixin, ListView):
model = Note
template_name = 'core/note_list.html'
context_object_name = 'notes'
def get_queryset(self):
return Note.objects.filter(user=self.request.user).order_by('-updated_at')
class NoteDetailView(LoginRequiredMixin, DetailView):
model = Note
template_name = 'core/note_detail.html'
context_object_name = 'note'
class NoteCreateView(LoginRequiredMixin, CreateView):
model = Note
template_name = 'core/note_form.html'
fields = ['title', 'content']
success_url = reverse_lazy('core:note_list')
def form_valid(self, form):
form.instance.user = self.request.user
return super().form_valid(form)
class NoteUpdateView(LoginRequiredMixin, UpdateView):
model = Note
template_name = 'core/note_form.html'
fields = ['title', 'content']
success_url = reverse_lazy('core:note_list')
class NoteDeleteView(LoginRequiredMixin, DeleteView):
model = Note
template_name = 'core/note_confirm_delete.html'
success_url = reverse_lazy('core:note_list')
from django_pandas.io import read_frame
from django.contrib import messages
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')
# Activity-Mood Correlation
activity_mood_data = []
activities = Activity.objects.all()
for activity in activities:
entries_with_activity = mood_entries.filter(activities=activity)
if entries_with_activity.exists():
avg_mood = entries_with_activity.aggregate(avg_mood=models.Avg('mood_score'))['avg_mood']
activity_mood_data.append({
'activity': activity.name,
'avg_mood': round(avg_mood, 2)
})
# AI-powered insights
ai_insight = ''
if mood_entries.exists():
latest_mood_data = list(mood_entries.order_by('-date_time')[:7].values('date_time', 'mood_score'))
prompt = f"Based on the following recent mood entries, provide a brief summary and one actionable recommendation. Mood data: {json.dumps(latest_mood_data, default=str)}"
ai_response = LocalAIApi.create_response({
"input": [
{"role": "system", "content": "You are a mental wellness assistant. Provide concise, actionable advice."},
{"role": "user", "content": prompt},
]
})
if ai_response.get("success"):
ai_insight = LocalAIApi.extract_text(ai_response)
return render(request, 'core/dashboard.html', {
'chart_data': chart_data,
'form': form,
'activity_mood_data': json.dumps(activity_mood_data),
'ai_insight': ai_insight,
})
@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)