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)