38840-vm/core/views.py
Flatlogic Bot fc8bd63b34 V2
2026-02-28 12:23:20 +00:00

196 lines
7.0 KiB
Python

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth import login, authenticate
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from .models import Profile, Tag, Startup, Investment, Message, Notification
from .forms import StartupForm, MessageForm
from django.contrib.auth.forms import UserCreationForm
from django import forms
from django.db.models import Sum, Q
def home(request):
return render(request, "core/index.html")
class SignupForm(UserCreationForm):
university_email = forms.EmailField(required=True, label="University or Graduate Email")
full_name = forms.CharField(required=True)
university_name = forms.CharField(required=True)
graduation_year = forms.IntegerField(required=True)
class Meta(UserCreationForm.Meta):
fields = UserCreationForm.Meta.fields + ('university_email',)
def signup_view(request):
if request.method == "POST":
form = SignupForm(request.POST)
if form.is_valid():
user = form.save()
profile = user.profile
profile.university = form.cleaned_data.get('university_name')
profile.graduation_year = form.cleaned_data.get('graduation_year')
profile.save()
# login(request, user) # Don't login yet, show verification screen
request.session['pending_verification_user_id'] = user.id
return redirect('verify')
else:
form = SignupForm()
return render(request, "core/signup.html", {"form": form})
def verify_view(request):
user_id = request.session.get('pending_verification_user_id')
if not user_id:
return redirect('signup')
if request.method == "POST":
user = get_object_or_404(User, id=user_id)
user.profile.is_verified = True
user.profile.save()
login(request, user)
return redirect('onboarding_role')
return render(request, "core/verify.html")
@login_required
def onboarding_role(request):
if request.method == "POST":
role = request.POST.get('role')
request.user.profile.role = role
request.user.profile.save()
if role == 'INVESTOR':
return redirect('onboarding_investor')
else:
return redirect('onboarding_founder')
return render(request, "core/onboarding/role.html")
@login_required
def onboarding_investor(request):
if request.method == "POST":
bio = request.POST.get('bio')
appetite = request.POST.get('appetite')
request.user.profile.bio = bio
request.user.profile.investment_appetite = appetite
request.user.profile.save()
return redirect('discover')
return render(request, "core/onboarding/investor.html")
@login_required
def onboarding_founder(request):
# This leads to partner matching questionnaire
return redirect('partner_matching')
@login_required
def onboarding_partner_matching(request):
if request.method == "POST":
# Save questionnaire answers in JSON format
request.user.profile.matching_answers = request.POST.dict()
request.user.profile.save()
return redirect('partners')
return render(request, "core/onboarding/partner_matching.html")
@login_required
def discover_startups(request):
startups = Startup.objects.filter(status='FUNDING').order_by('-created_at')
return render(request, "core/discover.html", {"startups": startups})
@login_required
def find_partners(request):
current_profile = request.user.profile
# Basic partner matching logic:
# 1. Same university
# 2. Shared interests (Tags) - if we had tags set up properly
# For now, let's just prioritize same university and then others.
partners = Profile.objects.filter(role='FOUNDER').exclude(user=request.user)
# Sort by same university
partners = sorted(partners, key=lambda p: p.university == current_profile.university, reverse=True)
return render(request, "core/partners.html", {"partners": partners})
@login_required
def my_portfolio(request):
profile = request.user.profile
investments = Investment.objects.filter(investor=profile)
total_invested = investments.aggregate(Sum('amount'))['amount__sum'] or 0
my_startups = Startup.objects.filter(founder=profile)
return render(request, "core/portfolio.html", {
"investments": investments,
"total_invested": total_invested,
"my_startups": my_startups
})
@login_required
def startup_detail(request, pk):
startup = get_object_or_404(Startup, pk=pk)
return render(request, "core/startup_detail.html", {"startup": startup})
@login_required
def invest(request, pk):
startup = get_object_or_404(Startup, pk=pk)
if request.method == "POST":
amount = request.POST.get('amount')
Investment.objects.create(
investor=request.user.profile,
startup=startup,
amount=amount
)
startup.raised_amount += float(amount)
startup.save()
return redirect('portfolio')
return render(request, "core/invest.html", {"startup": startup})
@login_required
def post_startup(request):
if request.method == "POST":
form = StartupForm(request.POST)
if form.is_valid():
startup = form.save(commit=False)
startup.founder = request.user.profile
startup.save()
return redirect('portfolio')
else:
form = StartupForm()
return render(request, "core/create_startup.html", {"form": form})
@login_required
def messages_view(request):
profile = request.user.profile
# Get all unique profiles the current user has chatted with
sent_to = Message.objects.filter(sender=profile).values_list('receiver', flat=True)
received_from = Message.objects.filter(receiver=profile).values_list('sender', flat=True)
chat_partner_ids = set(list(sent_to) + list(received_from))
chat_partners = Profile.objects.filter(id__in=chat_partner_ids)
return render(request, "core/messages.html", {"chat_partners": chat_partners})
@login_required
def chat_detail(request, pk):
sender_profile = request.user.profile
receiver_profile = get_object_or_404(Profile, pk=pk)
messages = Message.objects.filter(
(Q(sender=sender_profile) & Q(receiver=receiver_profile)) |
(Q(sender=receiver_profile) & Q(receiver=sender_profile))
).order_by('timestamp')
# Mark messages as read
Message.objects.filter(sender=receiver_profile, receiver=sender_profile, is_read=False).update(is_read=True)
if request.method == "POST":
form = MessageForm(request.POST)
if form.is_valid():
message = form.save(commit=False)
message.sender = sender_profile
message.receiver = receiver_profile
message.save()
return redirect('chat_detail', pk=pk)
else:
form = MessageForm()
return render(request, "core/chat_detail.html", {
"chat_partner": receiver_profile,
"messages": messages,
"form": form
})