diff --git a/config/__pycache__/__init__.cpython-311.pyc b/config/__pycache__/__init__.cpython-311.pyc index 423a636..abb44a2 100644 Binary files a/config/__pycache__/__init__.cpython-311.pyc and b/config/__pycache__/__init__.cpython-311.pyc differ diff --git a/config/__pycache__/settings.cpython-311.pyc b/config/__pycache__/settings.cpython-311.pyc index 96bce55..73abb21 100644 Binary files a/config/__pycache__/settings.cpython-311.pyc and b/config/__pycache__/settings.cpython-311.pyc differ diff --git a/config/__pycache__/urls.cpython-311.pyc b/config/__pycache__/urls.cpython-311.pyc index 0b85e94..fd771aa 100644 Binary files a/config/__pycache__/urls.cpython-311.pyc and b/config/__pycache__/urls.cpython-311.pyc differ diff --git a/config/__pycache__/wsgi.cpython-311.pyc b/config/__pycache__/wsgi.cpython-311.pyc index 9c49e09..3b6fa1f 100644 Binary files a/config/__pycache__/wsgi.cpython-311.pyc and b/config/__pycache__/wsgi.cpython-311.pyc differ diff --git a/config/settings.py b/config/settings.py index 291d043..b84b0e5 100644 --- a/config/settings.py +++ b/config/settings.py @@ -180,3 +180,5 @@ if EMAIL_USE_SSL: # https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' +MEDIA_URL = "/media/" +MEDIA_ROOT = os.path.join(BASE_DIR, "media") diff --git a/config/urls.py b/config/urls.py index bcfc074..cccd18f 100644 --- a/config/urls.py +++ b/config/urls.py @@ -27,3 +27,4 @@ urlpatterns = [ if settings.DEBUG: urlpatterns += static("/assets/", document_root=settings.BASE_DIR / "assets") urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file diff --git a/core/__pycache__/__init__.cpython-311.pyc b/core/__pycache__/__init__.cpython-311.pyc index 74b1112..9aed278 100644 Binary files a/core/__pycache__/__init__.cpython-311.pyc and b/core/__pycache__/__init__.cpython-311.pyc differ diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index a5ed392..cd3e694 100644 Binary files a/core/__pycache__/admin.cpython-311.pyc and b/core/__pycache__/admin.cpython-311.pyc differ diff --git a/core/__pycache__/apps.cpython-311.pyc b/core/__pycache__/apps.cpython-311.pyc index 6f131d4..cb1b371 100644 Binary files a/core/__pycache__/apps.cpython-311.pyc and b/core/__pycache__/apps.cpython-311.pyc differ diff --git a/core/__pycache__/context_processors.cpython-311.pyc b/core/__pycache__/context_processors.cpython-311.pyc index 75bf223..8da9bfe 100644 Binary files a/core/__pycache__/context_processors.cpython-311.pyc and b/core/__pycache__/context_processors.cpython-311.pyc differ diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc new file mode 100644 index 0000000..bd29a85 Binary files /dev/null and b/core/__pycache__/forms.cpython-311.pyc differ diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index e061640..3c08c18 100644 Binary files a/core/__pycache__/models.cpython-311.pyc and b/core/__pycache__/models.cpython-311.pyc differ diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 5a69659..1be8270 100644 Binary files a/core/__pycache__/urls.cpython-311.pyc and b/core/__pycache__/urls.cpython-311.pyc differ diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 2a36fd6..c18fba3 100644 Binary files a/core/__pycache__/views.cpython-311.pyc and b/core/__pycache__/views.cpython-311.pyc differ diff --git a/core/admin.py b/core/admin.py index 8c38f3f..f9fde42 100644 --- a/core/admin.py +++ b/core/admin.py @@ -1,3 +1,19 @@ from django.contrib import admin +from .models import Category, Item, Outfit, DailySchedule -# Register your models here. +@admin.register(Category) +class CategoryAdmin(admin.ModelAdmin): + list_display = ('name',) + +@admin.register(Item) +class ItemAdmin(admin.ModelAdmin): + list_display = ('name', 'item_type', 'category') + list_filter = ('item_type', 'category') + +@admin.register(Outfit) +class OutfitAdmin(admin.ModelAdmin): + list_display = ('name', 'created_at') + +@admin.register(DailySchedule) +class DailyScheduleAdmin(admin.ModelAdmin): + list_display = ('date', 'outfit') \ No newline at end of file diff --git a/core/forms.py b/core/forms.py new file mode 100644 index 0000000..0fafa54 --- /dev/null +++ b/core/forms.py @@ -0,0 +1,14 @@ +from django import forms +from .models import Item, Category + +class ItemForm(forms.ModelForm): + class Meta: + model = Item + fields = ['name', 'category', 'image', 'item_type', 'tags'] + widgets = { + 'name': forms.TextInput(attrs={'class': 'form-control bg-dark text-white border-secondary', 'placeholder': 'Item Name'}), + 'category': forms.Select(attrs={'class': 'form-select bg-dark text-white border-secondary'}), + 'item_type': forms.Select(attrs={'class': 'form-select bg-dark text-white border-secondary'}), + 'tags': forms.TextInput(attrs={'class': 'form-control bg-dark text-white border-secondary', 'placeholder': 'Tags (comma-separated)'}), + 'image': forms.FileInput(attrs={'class': 'form-control bg-dark text-white border-secondary'}), + } diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py new file mode 100644 index 0000000..d388fda --- /dev/null +++ b/core/migrations/0001_initial.py @@ -0,0 +1,53 @@ +# Generated by Django 5.2.7 on 2026-02-04 02:59 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Category', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ], + options={ + 'verbose_name_plural': 'Categories', + }, + ), + migrations.CreateModel( + name='Item', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ('image', models.ImageField(blank=True, null=True, upload_to='items/')), + ('item_type', models.CharField(choices=[('wardrobe', 'Wardrobe'), ('accessory', 'Accessory')], default='wardrobe', max_length=20)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='core.category')), + ], + ), + migrations.CreateModel( + name='Outfit', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(blank=True, max_length=255)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('items', models.ManyToManyField(related_name='outfits', to='core.item')), + ], + ), + migrations.CreateModel( + name='DailySchedule', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date', models.DateField(unique=True)), + ('outfit', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='core.outfit')), + ], + ), + ] diff --git a/core/migrations/0002_folder_outfit_folder.py b/core/migrations/0002_folder_outfit_folder.py new file mode 100644 index 0000000..129aca0 --- /dev/null +++ b/core/migrations/0002_folder_outfit_folder.py @@ -0,0 +1,27 @@ +# Generated by Django 5.2.7 on 2026-02-04 03:08 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Folder', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + migrations.AddField( + model_name='outfit', + name='folder', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='outfits', to='core.folder'), + ), + ] diff --git a/core/migrations/0003_dailyschedule_user_folder_user_item_tags_item_user_and_more.py b/core/migrations/0003_dailyschedule_user_folder_user_item_tags_item_user_and_more.py new file mode 100644 index 0000000..7a36fb6 --- /dev/null +++ b/core/migrations/0003_dailyschedule_user_folder_user_item_tags_item_user_and_more.py @@ -0,0 +1,50 @@ +# Generated by Django 5.2.7 on 2026-02-04 03:34 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0002_folder_outfit_folder'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='dailyschedule', + name='user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='schedules', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='folder', + name='user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='folders', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='item', + name='tags', + field=models.CharField(blank=True, help_text='Comma-separated tags', max_length=255), + ), + migrations.AddField( + model_name='item', + name='user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='items', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='outfit', + name='user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='outfits', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='dailyschedule', + name='date', + field=models.DateField(), + ), + migrations.AlterUniqueTogether( + name='dailyschedule', + unique_together={('user', 'date')}, + ), + ] diff --git a/core/migrations/__pycache__/0001_initial.cpython-311.pyc b/core/migrations/__pycache__/0001_initial.cpython-311.pyc new file mode 100644 index 0000000..3efe1ef Binary files /dev/null and b/core/migrations/__pycache__/0001_initial.cpython-311.pyc differ diff --git a/core/migrations/__pycache__/0002_folder_outfit_folder.cpython-311.pyc b/core/migrations/__pycache__/0002_folder_outfit_folder.cpython-311.pyc new file mode 100644 index 0000000..88ac720 Binary files /dev/null and b/core/migrations/__pycache__/0002_folder_outfit_folder.cpython-311.pyc differ diff --git a/core/migrations/__pycache__/0003_dailyschedule_user_folder_user_item_tags_item_user_and_more.cpython-311.pyc b/core/migrations/__pycache__/0003_dailyschedule_user_folder_user_item_tags_item_user_and_more.cpython-311.pyc new file mode 100644 index 0000000..9e31bf4 Binary files /dev/null and b/core/migrations/__pycache__/0003_dailyschedule_user_folder_user_item_tags_item_user_and_more.cpython-311.pyc differ diff --git a/core/migrations/__pycache__/__init__.cpython-311.pyc b/core/migrations/__pycache__/__init__.cpython-311.pyc index 9c833c8..21a48b2 100644 Binary files a/core/migrations/__pycache__/__init__.cpython-311.pyc and b/core/migrations/__pycache__/__init__.cpython-311.pyc differ diff --git a/core/models.py b/core/models.py index 71a8362..53a8eec 100644 --- a/core/models.py +++ b/core/models.py @@ -1,3 +1,58 @@ from django.db import models +from django.utils import timezone +from django.contrib.auth.models import User -# Create your models here. +class Category(models.Model): + name = models.CharField(max_length=100) + # e.g., 'Pants', 'T-shirts', 'Beanies', 'Rings' + + class Meta: + verbose_name_plural = "Categories" + + def __str__(self): + return self.name + +class Item(models.Model): + ITEM_TYPES = ( + ('wardrobe', 'Wardrobe'), + ('accessory', 'Accessory'), + ) + user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='items', null=True, blank=True) + name = models.CharField(max_length=255) + image = models.ImageField(upload_to='items/', blank=True, null=True) + category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, blank=True) + item_type = models.CharField(max_length=20, choices=ITEM_TYPES, default='wardrobe') + tags = models.CharField(max_length=255, blank=True, help_text="Comma-separated tags") + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return self.name + +class Folder(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='folders', null=True, blank=True) + name = models.CharField(max_length=100) + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return self.name + +class Outfit(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='outfits', null=True, blank=True) + name = models.CharField(max_length=255, blank=True) + items = models.ManyToManyField(Item, related_name='outfits') + folder = models.ForeignKey(Folder, on_delete=models.SET_NULL, null=True, blank=True, related_name='outfits') + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return self.name or f"Outfit {self.id}" + +class DailySchedule(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='schedules', null=True, blank=True) + date = models.DateField() + outfit = models.ForeignKey(Outfit, on_delete=models.SET_NULL, null=True, blank=True) + + class Meta: + unique_together = ('user', 'date') + + def __str__(self): + return f"{self.date} - {self.outfit}" \ No newline at end of file diff --git a/core/templates/base.html b/core/templates/base.html index 1e7e5fb..dc9a68b 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -1,25 +1,257 @@ +{% load static %} - - - {% block title %}Knowledge Base{% endblock %} - {% if project_description %} - - - - {% endif %} - {% if project_image_url %} - - - {% endif %} - {% load static %} - - {% block head %}{% endblock %} + + + {% block title %}New Style{% endblock %} + + + + + + + + + + + + {% block extra_css %}{% endblock %} - - {% block content %}{% endblock %} - +
+
+
+ {% if user.is_authenticated %} + + + {{ user.username }} + + {% endif %} +
+
+ NEW STYLE +
+
+ {% if user.is_authenticated %} +
+ {% csrf_token %} + +
+ {% else %} + + + + {% endif %} +
+
+ {% if user.is_authenticated %} + + {% endif %} + + {% block content %}{% endblock %} +
+ + + + {% block extra_js %}{% endblock %} + diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..16a974c 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,146 @@ {% extends "base.html" %} +{% load static %} -{% block title %}{{ project_name }}{% endblock %} - -{% block head %} - - - - -{% endblock %} +{% block title %}Weekly Planner - New Style{% endblock %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… +
+ +
+ {% for day in weekly_days|slice:":3" %} +
+
+ {% if day.schedule.outfit %} + +
{{ day.schedule.outfit.name }}
+ {% else %} + NO FIT + {% endif %} +
+ +
+ {% endfor %}
-

AppWizzy AI is collecting your requirements and applying the first changes.

-

This page will refresh automatically as the plan is implemented.

-

- Runtime: Django {{ django_version }} · Python {{ python_version }} - — UTC {{ current_time|date:"Y-m-d H:i:s" }} -

-
-
- -{% endblock %} \ No newline at end of file + + +
+ {% for day in weekly_days|slice:"3:5" %} +
+
+ {% if day.schedule.outfit %} + +
{{ day.schedule.outfit.name }}
+ {% else %} + NO FIT + {% endif %} +
+ +
+ {% endfor %} +
+ + +
+ {% for day in weekly_days|slice:"5:7" %} +
+
+ {% if day.schedule.outfit %} + +
{{ day.schedule.outfit.name }}
+ {% else %} + NO FIT + {% endif %} +
+ +
+ {% endfor %} +
+ + +
+ +
+
+ + {{ total_items }} ITEMS LOADED +
+
+ + + + +
+
+ + + +{% endblock %} + +{% block extra_js %} + +{% endblock %} diff --git a/core/templates/core/new_fit.html b/core/templates/core/new_fit.html new file mode 100644 index 0000000..d1eb15e --- /dev/null +++ b/core/templates/core/new_fit.html @@ -0,0 +1,263 @@ +{% extends "base.html" %} +{% load static %} + +{% block title %}New Fit - New Style{% endblock %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} +
+
+
Outfit Preview
+ +
+ +
+
ALL
+ {% for cat in categories %} +
{{ cat.name|upper }}
+ {% endfor %} +
+ +
+ {% for item in items %} +
+ {{ item.name }} +
+
+ {% empty %} +
+

No items in your wardrobe yet.

+ Add Items +
+ {% endfor %} +
+
+ +
+ + +
+ + + +{% endblock %} + +{% block extra_js %} + +{% endblock %} \ No newline at end of file diff --git a/core/templates/core/outfits.html b/core/templates/core/outfits.html new file mode 100644 index 0000000..36b7cfa --- /dev/null +++ b/core/templates/core/outfits.html @@ -0,0 +1,158 @@ +{% extends "base.html" %} + +{% block title %}My Outfits - New Style{% endblock %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} +
+

COLLECTIONS

+ +
+ +
+ {% for folder in folders %} +
+ + {{ folder.name }} + {{ folder.outfits.count }} OUTFITS +
+ {% empty %} +
No folders created yet.
+ {% endfor %} +
+ +
+ +

UNCATEGORIZED FITS

+ +
+ {% for outfit in outfits %} +
+
+ {% if outfit.items.exists %} + {{ outfit.name }} + {% else %} + + {% endif %} +
+
+

{{ outfit.name|default:"UNTITLED" }}

+
+ {{ outfit.items.count }} ITEMS +
+
+
+ {% empty %} +
+

No outfits found.

+ CREATE NEW FIT +
+ {% endfor %} +
+ + + +{% endblock %} \ No newline at end of file diff --git a/core/templates/core/wardrobe.html b/core/templates/core/wardrobe.html new file mode 100644 index 0000000..e1d42e7 --- /dev/null +++ b/core/templates/core/wardrobe.html @@ -0,0 +1,164 @@ +{% extends "base.html" %} + +{% block title %}{{ title }} - New Style{% endblock %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} +
+

{{ title|upper }}

+ +
+ +
+ {% for item in items %} +
+
+ {% if item.image %} + {{ item.name }} + {% else %} +
+ +
+ {% endif %} +
+
+
+ {% csrf_token %} + +
+
+
+

{{ item.name }}

+
+ {{ item.category.name|default:"General" }} + {% if item.tags %} +
+ {% for tag in item.tags.split|slice:":2" %} + {{ tag }} + {% endfor %} +
+ {% endif %} +
+
+
+ {% empty %} +
+ +

Your {{ title|lower }} is empty.

+ +
+ {% endfor %} +
+ + + +{% endblock %} \ No newline at end of file diff --git a/core/templates/registration/login.html b/core/templates/registration/login.html new file mode 100644 index 0000000..3cff058 --- /dev/null +++ b/core/templates/registration/login.html @@ -0,0 +1,29 @@ +{% extends "base.html" %} + +{% block title %}Login - New Style{% endblock %} + +{% block content %} +
+

LOGIN

+
+
+
+ {% csrf_token %} +
+ + +
+
+ + +
+ +
+
+

Don't have an account?

+ SIGN UP +
+
+
+
+{% endblock %} diff --git a/core/templates/registration/signup.html b/core/templates/registration/signup.html new file mode 100644 index 0000000..5d68847 --- /dev/null +++ b/core/templates/registration/signup.html @@ -0,0 +1,41 @@ +{% extends "base.html" %} + +{% block title %}Sign Up - New Style{% endblock %} + +{% block content %} +
+

SIGN UP

+
+
+
+ {% csrf_token %} + {% for field in form %} +
+ + {{ field }} + {% if field.help_text %} +
{{ field.help_text }}
+ {% endif %} + {% for error in field.errors %} +
{{ error }}
+ {% endfor %} +
+ {% endfor %} + +
+
+

Already have an account?

+ LOG IN +
+
+
+
+ + +{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..7c2f6c9 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,21 @@ -from django.urls import path - -from .views import home +from django.urls import path, include +from django.contrib.auth import views as auth_views +from . import views urlpatterns = [ - path("", home, name="home"), -] + path('', views.home, name='home'), + path('new-fit/', views.new_fit, name='new_fit'), + path('outfits/', views.outfits, name='outfits'), + path('wardrobe/', views.wardrobe, name='wardrobe'), + path('accessories/', views.accessories, name='accessories'), + path('add-item/', views.add_item, name='add_item'), + path('delete-item//', views.delete_item, name='delete_item'), + path('save-outfit/', views.save_outfit, name='save_outfit'), + path('schedule-outfit/', views.schedule_outfit, name='schedule_outfit'), + path('create-folder/', views.create_folder, name='create_folder'), + + # Auth + path('accounts/login/', auth_views.LoginView.as_view(template_name='registration/login.html'), name='login'), + path('accounts/logout/', auth_views.LogoutView.as_view(next_page='login'), name='logout'), + path('accounts/signup/', views.signup, name='signup'), +] \ No newline at end of file diff --git a/core/views.py b/core/views.py index c9aed12..84ccefd 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,167 @@ import os -import platform +from datetime import date, timedelta +from django.shortcuts import render, get_object_or_404, redirect +from django.contrib.auth.decorators import login_required +from django.contrib.auth.forms import UserCreationForm +from django.contrib.auth import login +from django.db.models import Q +from .models import Item, Outfit, DailySchedule, Category, Folder +from .forms import ItemForm -from django import get_version as django_version -from django.shortcuts import render -from django.utils import timezone +def signup(request): + if request.method == 'POST': + form = UserCreationForm(request.POST) + if form.is_valid(): + user = form.save() + login(request, user) + return redirect('home') + else: + form = UserCreationForm() + return render(request, 'registration/signup.html', {'form': form}) +def get_weekly_schedule(user): + today = date.today() + start_of_week = today - timedelta(days=today.weekday()) + days = [] + for i in range(7): + day_date = start_of_week + timedelta(days=i) + schedule, _ = DailySchedule.objects.get_or_create(user=user, date=day_date) + days.append({ + 'date': day_date, + 'day_name': day_date.strftime('%A'), + 'schedule': schedule + }) + return days +@login_required def home(request): - """Render the landing screen with loader and environment details.""" - host_name = request.get_host().lower() - agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic" - now = timezone.now() + """Render the landing screen with the weekly planner grid.""" + weekly_days = get_weekly_schedule(request.user) + total_items = Item.objects.filter(user=request.user).count() + + month = date.today().month + if month in [12, 1, 2]: + season = "Winter" + elif month in [3, 4, 5]: + season = "Spring" + elif month in [6, 7, 8]: + season = "Summer" + else: + season = "Autumn" context = { + "weekly_days": weekly_days, + "total_items": total_items, + "current_season": season, "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), - "current_time": now, - "host_name": host_name, - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), - "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), } return render(request, "core/index.html", context) + +@login_required +def new_fit(request): + """View to create a new outfit on a model.""" + items = Item.objects.filter(user=request.user) + categories = Category.objects.all() + context = { + "title": "New Fit", + "items": items, + "categories": categories, + "total_items": items.count(), + } + return render(request, "core/new_fit.html", context) + +@login_required +def outfits(request): + """View all saved outfits and folders.""" + outfits = Outfit.objects.filter(user=request.user, folder__isnull=True) + folders = Folder.objects.filter(user=request.user) + context = { + "outfits": outfits, + "folders": folders, + "title": "Outfits", + "total_items": Item.objects.filter(user=request.user).count(), + } + return render(request, "core/outfits.html", context) + +@login_required +def wardrobe(request): + """Render the wardrobe items.""" + items = Item.objects.filter(user=request.user, item_type='wardrobe') + categories = Category.objects.all() + form = ItemForm(initial={'item_type': 'wardrobe'}) + context = { + "items": items, + "categories": categories, + "title": "Wardrobe", + "total_items": Item.objects.filter(user=request.user).count(), + "form": form, + } + return render(request, "core/wardrobe.html", context) + +@login_required +def accessories(request): + """Render the accessories items.""" + items = Item.objects.filter(user=request.user, item_type='accessory') + categories = Category.objects.all() + form = ItemForm(initial={'item_type': 'accessory'}) + context = { + "items": items, + "categories": categories, + "title": "Accessories", + "total_items": Item.objects.filter(user=request.user).count(), + "form": form, + } + return render(request, "core/wardrobe.html", context) + +@login_required +def add_item(request): + """Handle item creation.""" + if request.method == 'POST': + form = ItemForm(request.POST, request.FILES) + if form.is_valid(): + item = form.save(commit=False) + item.user = request.user + item.save() + if item.item_type == 'accessory': + return redirect('accessories') + return redirect('wardrobe') + return redirect('wardrobe') + +@login_required +def delete_item(request, pk): + item = get_object_or_404(Item, pk=pk, user=request.user) + item.delete() + return redirect(request.META.get('HTTP_REFERER', 'wardrobe')) + +@login_required +def save_outfit(request): + if request.method == 'POST': + name = request.POST.get('name', 'Untitled Outfit') + item_ids = request.POST.getlist('items') + outfit = Outfit.objects.create(user=request.user, name=name) + if item_ids: + outfit.items.add(*item_ids) + return redirect('outfits') + return redirect('new_fit') + +@login_required +def schedule_outfit(request): + if request.method == 'POST': + day_date = request.POST.get('date') + outfit_id = request.POST.get('outfit_id') + schedule = get_object_or_404(DailySchedule, user=request.user, date=day_date) + if outfit_id: + outfit = get_object_or_404(Outfit, pk=outfit_id, user=request.user) + schedule.outfit = outfit + else: + schedule.outfit = None + schedule.save() + return redirect('home') + +@login_required +def create_folder(request): + if request.method == 'POST': + name = request.POST.get('name') + if name: + Folder.objects.create(user=request.user, name=name) + return redirect('outfits') \ No newline at end of file