Update users app, add login/registser/profile template

This commit is contained in:
Krzysztof 2021-02-05 18:05:47 +01:00
parent c1721595ee
commit 7de2d58b80
28 changed files with 305 additions and 229 deletions

View File

@ -10,6 +10,7 @@
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
</head> </head>
<body> <body>
<div class='header-smart-baner'> <!-- TOP HEADER SMART BANER--> <div class='header-smart-baner'> <!-- TOP HEADER SMART BANER-->
@ -21,9 +22,7 @@
<div class='header-logo'> <a href='{{ request.scheme }}://{{ request.META.HTTP_HOST }}/'> vagus </a> </div> <div class='header-logo'> <a href='{{ request.scheme }}://{{ request.META.HTTP_HOST }}/'> vagus </a> </div>
<div class='header-nav'> <div class='header-nav'>
<a href='{{ request.scheme }}://{{ request.META.HTTP_HOST }}/offers'>KAMPERY </a> <a href='{{ request.scheme }}://{{ request.META.HTTP_HOST }}/offers'>KAMPERY </a>
<a href='#'>O NAS </a>
<a href='#'>FAQ</a>
<a href='#'>KONTAKT </a>
<a href='{{ request.scheme }}://{{ request.META.HTTP_HOST }}/add-offer'>DODAJ OFERTĘ </a> <a href='{{ request.scheme }}://{{ request.META.HTTP_HOST }}/add-offer'>DODAJ OFERTĘ </a>
<div class='header-nav-bar'> <div class='header-nav-bar'>
<div class='header-nav-bar-container'> <div class='header-nav-bar-container'>
@ -36,7 +35,7 @@
<a href='{{ request.scheme }}://{{ request.META.HTTP_HOST }}/profile'>Witaj, Adminie </a> <a href='{{ request.scheme }}://{{ request.META.HTTP_HOST }}/profile'>Witaj, Adminie </a>
{% endif %} {% endif %}
{% else %} {% else %}
<a href='{{ request.scheme }}://{{ request.META.HTTP_HOST }}/signup'>Witaj, nieznajomy </a> <a href='{{ request.scheme }}://{{ request.META.HTTP_HOST }}/login'>Witaj, nieznajomy </a>
{% endif %} {% endif %}
</div> </div>
<div class='header-nav-bar-avatar'> <div class='header-nav-bar-avatar'>

View File

@ -13,18 +13,20 @@
</div> </div>
{% endfor %} {% endfor %}
<button id="add-form" type="button">Dodaj kolejne zdjęcie</button> <button id="add-form" type="button">Dodaj kolejne zdjęcie</button> <button id="delete-form" type="button">Usuń pole</button>
<div> <button style="background-color:black; color:white" class="btn btn-outline-info" type="submit">Create Offer </button></div> <div> <button style="background-color:black; color:white" class="btn btn-outline-info" type="submit">Create Offer </button></div>
</form> </form>
<script> <script>
let imageForm = document.querySelectorAll(".image-form") let imageForm = document.querySelectorAll(".image-form")
let container = document.querySelector("#form-container") let container = document.querySelector("#form-container")
let addButton = document.querySelector("#add-form") let addButton = document.querySelector("#add-form")
let deleteButton = document.querySelector("#delete-form")
let totalForms = document.querySelector("#id_form-TOTAL_FORMS") let totalForms = document.querySelector("#id_form-TOTAL_FORMS")
let formNum = imageForm .length-1 let formNum = imageForm .length-1
addButton.addEventListener('click', addForm) addButton.addEventListener('click', addForm)
deleteButton.addEventListener('click', removeForm)
function addForm(e){ function addForm(e){
e.preventDefault() e.preventDefault()
@ -37,5 +39,6 @@
totalForms.setAttribute('value', `${formNum+1}`) totalForms.setAttribute('value', `${formNum+1}`)
} }
</script> </script>
{% endblock content %} {% endblock content %}

View File

@ -1,26 +0,0 @@
{% extends 'index.html' %}
{% load static %}
{% block content %}
<form action=""" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p}}
{{ formset.management_form }}
{% for photo in formset %}
<div class="form-cotainer">
<div class="image-form">
<label> {{photo.image}} {{photo.main_image}} </label>
</div>
</div>
{% endfor %}
<button id="add-form" type="button">Dodaj kolejne zdjęcie</button>
<button style="background-color:black; color:white" class="btn btn-outline-info" type="submit">Create Offer </button>
</form>
{% endblock content %}

View File

@ -1,39 +1,79 @@
{% extends 'index.html' %} {% extends 'index.html' %}
{% load static %}
{% block content %} {% block content %}
<div class="offer-detail-wrapper">
<div class='offer-detail-row'>
<div class='offer-detail-content'>
<div class='offer-detail-stauts'>
{% if offer.status != 'Active'%}
<span class='offer-detail-status-info'> OFERTA NIEAKTYWNA </span>
{% endif %}
</div>
<div class='offer-detail-title'>
<span class='offer-detail-title-text'> {{offer.title}} </span>
</div>
<div class='offer-detail-images'>
<div class='offer-detail-images-img-thumbnail'>
{% if offer.images.all %}
{% for photo in offer.images.all %}
{% if photo.main_image == True%}
<img src="{{ photo.image.url }}" width = 600px>
{% endif %}
{% endfor %}
{%endif%}
</div>
<div class='offer-detail-images-gallery'>
{% if offer.images.all %}
{% for photo in offer.images.all %}
<img src="{{ photo.image.url }}" width = 300px>
{% endfor %}
{% endif %}
</div>
<div class='offer-detail-description'>
<span class='offer-detail-description-text'> {{offer.description}} </span>
</div>
<div class='offer-detail-parameters'>
<ul>
<li> 'DMC' <b> {{offer.DMC}} </b> </li>
<li> 'Places_to_sleep' <b> {{offer.Places_to_sleep}} </b></li>
<li> 'cooker' <b> {{offer.cooker}} </b></li>
<li> 'fridge' <b> {{offer.fridge}} </b></li>
<li> 'microwave' <b> {{offer.microwave}} </b></li>
<li> 'Webasto' <b> {{offer.Webasto}} </b></li>
<li> 'auto_temp_control' <b> {{offer.auto_temp_control}} </b></li>
<li> 'water_level_indicator' <b> {{offer.water_level_indicator}} </b> </li>
<li> 'battery_level'<b> {{offer.battery_level}} </b> </li>
<li> 'photovoltaic_panels' <b> {{offer.photovoltaic_panels}} </b> </li>
<li> 'gearbox <b> {{offer.gearbox}} </b> </li>
<li> 'tempomat' <b> {{offer.tempomat}} </b> </li>
</ul>
</div>
</div>
</div>
<div class='offer-reservation'>
<form id="form-container" method="POST" class="reservation-form">
{% csrf_token %}
{{ form.media }}
{{form.as_p}}
<button style="background-color:black; color:white" class="btn btn-outline-info" type="submit">Wyślij zapytanie</button>
</form>
<div>
</div>
</div>
</div>
</div>
{% endblock content %} {% endblock content %}
{% if offer.status != 'Active'%}
<h1> OFERTA NIEKATYWNA </h1>
{% endif %}
<h1> {{ offer.title }} </h1>
{{offer.created_by}}
<p> {{ offer.price }} PLN / dzień</p>
<ul>
<li> 'DMC' <b> {{offer.DMC}} </b> </li>
<li> 'Places_to_sleep' <b> {{offer.Places_to_sleep}} </b></li>
<li> 'cooker' <b> {{offer.cooker}} </b></li>
<li> 'fridge' <b> {{offer.fridge}} </b></li>
<li> 'microwave' <b> {{offer.microwave}} </b></li>
<li> 'Webasto' <b> {{offer.Webasto}} </b></li>
<li> 'auto_temp_control' <b> {{offer.auto_temp_control}} </b></li>
<li> 'water_level_indicator' <b> {{offer.water_level_indicator}} </b> </li>
<li> 'battery_level'<b> {{offer.battery_level}} </b> </li>
<li> 'photovoltaic_panels' <b> {{offer.photovoltaic_panels}} </b> </li>
<li> 'gearbox <b> {{offer.gearbox}} </b> </li>
<li> 'tempomat' <b> {{offer.tempomat}} </b> </li>
</ul>
<h2> THUMBNAIL </h2>
<h2> GALLERY </h2>
{% for photo in offer.images.all %}
<img src="{{ photo.image.url }}" width = 600px>
{% endfor %}

41
vagus/template/users/login.html Executable file
View File

@ -0,0 +1,41 @@
{% extends 'index.html' %}
{% load static %}
{% block content %}
<main class="login-form">
<div class="cotainer">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">Login</div>
<div class="card-body">
<form action="" method="POST">
{% csrf_token %}
{% for field in form %}
<div class="form-group row">
<label for="email_address" class="col-md-4 col-form-label text-md-right">{{field.label_tag}}</label>
<div class="col-md-6">
{{field}}
{% for error in field.errors %}
<p style="color: red">{{ error }}</p>
{% endfor %}
</div>
</div>
{% endfor %}
<div class="col-md-6 offset-md-4">
<button type="submit" class="btn btn-primary">
Login
</button>
<a href='{{ request.scheme }}://{{ request.META.HTTP_HOST }}/register'>Nie masz konta? Zarejestruj się!</a>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</main>
{% endblock %}

View File

@ -21,9 +21,60 @@
</div> </div>
</div> </div>
<div class='profile-wrapper-row-content'> <div class='profile-wrapper-row-content'>
{% for offer in offers%} {% if user_offers %}
{{offer.id}} <h4> Moje oferty </h4>
{% endfor %} <table class="table ">
<thead>
<tr>
<th scope="col">Tytuł oferty</th>
<th scope="col">Data Dodania</th>
<th scope="col">Kategoria</th>
<th scope="col">Cena</th>
<th scope="col">Status</th>
</tr>
</thead>
<tbody>
{% for offer in user_offers %}
<tr>
<td>
<a href="{{ offer.get_absolute_url }}">{{ offer.title }}</a>
</td>
<td title="{{ offer.date_added}}">{{ offer.date_added }}</td>
<td>{{ offer.category }}</td>
<td>{{ offer.price|capfirst }}</td>
<td> {{offer.status}} </td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif%}
{% if user_reservations %}
<h4> Moje rezerwacje </h4>
<table class="table ">
<thead>
<tr>
<th scope="col">Tytuł oferty</th>
<th scope="col">Data rezerwacji</th>
<th scope="col">Początek rezerwacji</th>
<th scope="col">Koniec rezerwacji</th>
<th scope="col">Status</th>
</tr>
</thead>
<tbody>
{% for reservation in user_reservations %}
<tr>
<td>
<a href="{{ reservation.offer.get_absolute_url }}">{{ reservation.offer.title }}</a>
</td>
<td title="{{ reservation.created_date}}">{{ reservation.created_date }}</td>
<td>{{ reservation.reservation_start_date }}</td>
<td>{{ reservation.reservation_end_date }}</td>
<td> {{reservation.status}} </td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
</div> </div>
</div> </div>
</div> </div>

View File

@ -0,0 +1,41 @@
{% extends 'index.html' %}
{% load static %}
{% block content %}
<main class="my-form">
<div class="cotainer">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">Register</div>
<div class="card-body">
<form name="my-form" method="POST">
{% csrf_token %}
{% for field in form %}
<div class="form-group row">
<label for="email_address" class="col-md-4 col-form-label text-md-right">{{field.label_tag}}</label>
<div class="col-md-6">
{{field}}
{% for error in field.errors %}
<p style="color: red">{{ error }}</p>
{% endfor %}
</div>
</div>
{% endfor %}
<div class="col-md-6 offset-md-4">
<button type="submit" class="btn btn-primary">
Register
</button>
<a href='{{ request.scheme }}://{{ request.META.HTTP_HOST }}/login'>Masz ju konto? Zaloguj się!</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</main>
{% endblock %}

View File

@ -1,13 +1,10 @@
from django.contrib import admin from django.contrib import admin
from .models import Base_User, OwnerUser, NormalUser from .models import Base_User, OwnerUser
from .forms import CustomUserCreationForm, CustomUserChangeForm from .forms import CustomUserCreationForm, CustomUserChangeForm
from django.contrib.auth.admin import UserAdmin from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
class NormalUserInline(admin.StackedInline):
model = NormalUser
can_delete = False
verbose_name_plural = 'Normal user'
class OwnerUserInLine(admin.StackedInline): class OwnerUserInLine(admin.StackedInline):
model = OwnerUser model = OwnerUser
@ -20,17 +17,17 @@ class CustomUserAdmin(UserAdmin):
form = CustomUserChangeForm form = CustomUserChangeForm
model = Base_User model = Base_User
inlines = (NormalUserInline,OwnerUserInLine) inlines = [OwnerUserInLine,]
list_display = ('id','email', "is_staff", "is_active","is_superuser",'status') list_display = ('id','email', "is_staff", "is_active","is_superuser",'status')
fieldsets = ( fieldsets = (
(None, {'fields': ('email','phone','first_name','last_name', 'password','status','avatar')}), (None, {'fields': ('email','first_name','last_name', 'password','status','avatar')}),
('Permissions', {'fields': ('is_staff', 'is_active',)}), ('Permissions', {'fields': ('is_staff', 'is_active',)}),
) )
add_fieldsets = ( add_fieldsets = (
(None, { (None, {
'classes': ('wide',), 'classes': ('wide',),
'fields': ('email','phone','first_name','last_name', 'password1', 'password2', 'is_staff', 'is_active','status','avatar')} 'fields': ('email','first_name','last_name', 'password1', 'password2', 'is_staff', 'is_active','status','avatar')}
), ),
) )
ordering = ('email',) ordering = ('email',)

View File

@ -6,17 +6,20 @@ from .models import Base_User
class CustomUserCreationForm(UserCreationForm): class CustomUserCreationForm(UserCreationForm):
phone = PhoneNumberField() email = forms.EmailField(max_length=254,)
class Meta(UserCreationForm): class Meta(UserCreationForm):
model = Base_User model = Base_User
fields =['email','password','phone'] fields =['email','first_name','last_name','avatar']
class CustomUserChangeForm(UserChangeForm): class CustomUserChangeForm(UserChangeForm):
phone = PhoneNumberField()
class Meta: class Meta:
model = Base_User model = Base_User
fields = ['email','password','phone'] fields = ['email','first_name','last_name','avatar']
class LoginForm(forms.Form):
class Meta:
model = Base_User
fields = ['email','password']

View File

@ -1,4 +1,4 @@
# Generated by Django 3.1.3 on 2021-01-09 19:40 # Generated by Django 3.1.3 on 2021-02-05 14:58
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models
@ -22,10 +22,13 @@ class Migration(migrations.Migration):
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('id', models.AutoField(primary_key=True, serialize=False)), ('id', models.AutoField(primary_key=True, serialize=False)),
('email', models.EmailField(max_length=254, unique=True, verbose_name='Email')), ('email', models.EmailField(max_length=254, unique=True, verbose_name='Email')),
('first_name', models.CharField(default='', max_length=30, verbose_name='First Name')),
('last_name', models.CharField(default='', max_length=30, verbose_name='Last name')),
('avatar', models.ImageField(blank=True, null=True, upload_to='media/avatars')),
('is_staff', models.BooleanField(default=False)), ('is_staff', models.BooleanField(default=False)),
('is_active', models.BooleanField(default=True)), ('is_active', models.BooleanField(default=True)),
('date_joined', models.DateTimeField(auto_now_add=True, verbose_name='Date joined')), ('date_joined', models.DateTimeField(auto_now_add=True, verbose_name='Date joined')),
('status', models.CharField(choices=[('Company_Account', 'Company account'), ('Regular_Account', 'Regular account'), ('Need_verification', 'Wait for verification'), ('BaseAcc', 'Base account'), ('Moderaotr', 'Moderator')], default='BaseAcc', max_length=32)), ('status', models.CharField(choices=[('Company_Account', 'Company account'), ('Regular_Account', 'Regular account'), ('Need_verification', 'Wait for verification'), ('BaseAcc', 'Base account'), ('Moderator', 'Moderator')], default='BaseAcc', max_length=32)),
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
], ],
@ -38,8 +41,6 @@ class Migration(migrations.Migration):
name='OwnerUser', name='OwnerUser',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('first_name', models.CharField(max_length=30, verbose_name='First Name')),
('last_name', models.CharField(max_length=30, verbose_name='Last name')),
('company_name', models.CharField(blank=True, max_length=30, verbose_name='Company name')), ('company_name', models.CharField(blank=True, max_length=30, verbose_name='Company name')),
('user', models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ('user', models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
], ],
@ -48,8 +49,6 @@ class Migration(migrations.Migration):
name='NormalUser', name='NormalUser',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('first_name', models.CharField(max_length=30, verbose_name='First Name')),
('last_name', models.CharField(max_length=30, verbose_name='Last name')),
('birth_date', models.DateField(blank=True, null=True, verbose_name='Birth date')), ('birth_date', models.DateField(blank=True, null=True, verbose_name='Birth date')),
('user', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ('user', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
], ],

View File

@ -1,39 +0,0 @@
# Generated by Django 3.1.3 on 2021-01-14 11:36
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0001_initial'),
]
operations = [
migrations.RemoveField(
model_name='normaluser',
name='first_name',
),
migrations.RemoveField(
model_name='normaluser',
name='last_name',
),
migrations.RemoveField(
model_name='owneruser',
name='first_name',
),
migrations.RemoveField(
model_name='owneruser',
name='last_name',
),
migrations.AddField(
model_name='base_user',
name='first_name',
field=models.CharField(default='', max_length=30, verbose_name='First Name'),
),
migrations.AddField(
model_name='base_user',
name='last_name',
field=models.CharField(default='', max_length=30, verbose_name='Last name'),
),
]

View File

@ -0,0 +1,21 @@
# Generated by Django 3.1.3 on 2021-02-05 15:12
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='base_user',
name='status',
field=models.CharField(choices=[('Company_Account', 'Company account'), ('Need_verification', 'Wait for verification'), ('BaseAcc', 'Base account'), ('Moderator', 'Moderator')], default='BaseAcc', max_length=32),
),
migrations.DeleteModel(
name='NormalUser',
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 3.1.3 on 2021-01-14 11:37
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0002_auto_20210114_1136'),
]
operations = [
migrations.AddField(
model_name='base_user',
name='avatar',
field=models.ImageField(blank=True, null=True, upload_to='media/avatars'),
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 3.1.3 on 2021-01-14 20:51
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0003_base_user_avatar'),
]
operations = [
migrations.AlterField(
model_name='base_user',
name='status',
field=models.CharField(choices=[('Company_Account', 'Company account'), ('Regular_Account', 'Regular account'), ('Need_verification', 'Wait for verification'), ('BaseAcc', 'Base account'), ('Moderator', 'Moderator')], default='BaseAcc', max_length=32),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 3.1.3 on 2021-01-26 19:13
from django.db import migrations
import phonenumber_field.modelfields
class Migration(migrations.Migration):
dependencies = [
('users', '0004_auto_20210114_2051'),
]
operations = [
migrations.AddField(
model_name='base_user',
name='phone',
field=phonenumber_field.modelfields.PhoneNumberField(blank=True, default='', max_length=128, null=True, region=None, unique=True),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 3.1.3 on 2021-01-28 13:55
from django.db import migrations
import phonenumber_field.modelfields
class Migration(migrations.Migration):
dependencies = [
('users', '0005_base_user_phone'),
]
operations = [
migrations.AlterField(
model_name='base_user',
name='phone',
field=phonenumber_field.modelfields.PhoneNumberField(default='', max_length=128, region=None, unique=True),
),
]

View File

@ -6,7 +6,6 @@ from django.utils.translation import gettext_lazy as _
STATUS =( STATUS =(
('Company_Account', _('Company account')), ('Company_Account', _('Company account')),
('Regular_Account',_('Regular account')),
('Need_verification', _("Wait for verification")), ('Need_verification', _("Wait for verification")),
('BaseAcc',_('Base account')), ('BaseAcc',_('Base account')),
('Moderator',_('Moderator')), ('Moderator',_('Moderator')),
@ -42,7 +41,6 @@ class UserManager(BaseUserManager):
class Base_User(AbstractBaseUser,PermissionsMixin): class Base_User(AbstractBaseUser,PermissionsMixin):
id = models.AutoField(primary_key= True) id = models.AutoField(primary_key= True)
email = models.EmailField(_('Email'), unique= True) email = models.EmailField(_('Email'), unique= True)
phone = PhoneNumberField(null = False, blank = False, unique = True, default = '')
avatar = models.ImageField(upload_to='media/avatars', null = True, blank = True,default='media/avatars/default.png') avatar = models.ImageField(upload_to='media/avatars', null = True, blank = True,default='media/avatars/default.png')
first_name = models.CharField(_('First Name'), max_length=30, blank = False, default = '') first_name = models.CharField(_('First Name'), max_length=30, blank = False, default = '')
@ -54,7 +52,6 @@ class Base_User(AbstractBaseUser,PermissionsMixin):
is_active = models.BooleanField(default=True) is_active = models.BooleanField(default=True)
date_joined = models.DateTimeField(_('Date joined'),auto_now_add=True) date_joined = models.DateTimeField(_('Date joined'),auto_now_add=True)
#last_login = models.DateTimeField(_("Last Login"),auto_now_add= Tr )
status = models.CharField(max_length=32, choices=STATUS, default='BaseAcc') status = models.CharField(max_length=32, choices=STATUS, default='BaseAcc')
USERNAME_FIELD = 'email' USERNAME_FIELD = 'email'
@ -67,13 +64,6 @@ class Base_User(AbstractBaseUser,PermissionsMixin):
class Meta: class Meta:
verbose_name = "User" verbose_name = "User"
verbose_name_plural = "Users" verbose_name_plural = "Users"
class NormalUser(models.Model):
user = models.OneToOneField(Base_User, on_delete=models.CASCADE, blank= True,null = True )
birth_date = models.DateField(_('Birth date'),null=True, blank=True)
#add fields Country, state, postal code, city, address1, address2
class OwnerUser(models.Model): class OwnerUser(models.Model):

View File

@ -2,9 +2,12 @@ from django.conf.urls import url
from django.urls import path from django.urls import path
from django.conf.urls.static import static from django.conf.urls.static import static
from . import views from . import views
from django.contrib.auth.decorators import login_required
urlpatterns = [ urlpatterns = [
path('profile', views.ProfileView.as_view(), name = 'profile_view'), path('profile', login_required(views.user_profile), name = 'profile_view'),
path('logout', views.logout_view, name ='logout_user'), path('logout', views.logout_view, name ='logout_user'),
path('register',views.Register_View.as_view(), name = 'register'),
path('login',views.Login_View.as_view(),name = 'login'),
] ]

View File

@ -1,38 +1,27 @@
from django.shortcuts import render from django.shortcuts import render
from .forms import CustomUserCreationForm from .forms import CustomUserCreationForm, LoginForm
from django.shortcuts import render, redirect from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from .models import Base_User, NormalUser, OwnerUser from .models import Base_User,OwnerUser
from django.views.generic import ( from django.views.generic import (
View, View,
CreateView,
FormView
) )
from django.contrib.auth import logout from django.contrib.auth import authenticate,login,logout
from django.conf import settings from django.conf import settings
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.contrib import messages from django.contrib import messages
from camper.models import Offer from camper.models import Offer
from reservation.models import Reservation
from django.contrib.auth import views as auth_views
# Create your views here. # Create your views here.
#REJESTRACJA BASE USERA NASTĘPNIE WYBOR JAKI RODZAJ KONTA UZYTKOWNIK CCHE ZALOZYC #REJESTRACJA BASE USERA NASTĘPNIE WYBOR JAKI RODZAJ KONTA UZYTKOWNIK CCHE ZALOZYC
# * W PRZYPADKU Klikniecia 'Wynajmij swoj kamper' autoatmtycznie wybierz rodzaj konta na OwnerUser # * W PRZYPADKU Klikniecia 'Wynajmij swoj kamper' autoatmtycznie wybierz rodzaj konta na OwnerUser
class RegisterBaseUser(): # tworzy BaseUsera ze statusem BaseACC dla NormalUser i OwnerUser
def register_create_base_user(self,request):
pass
def register_auth_email(self):
pass
class UserPickAccStatus(): #uzytkownik wybiera swoj rodzaj konta i uzuieplnia danymi
pass
class UpgradeProfileToOwnerUser(): #uzytkownik moze w kazdej cwhili zmienic swoje konto na konto firmowe
pass
class DowngradeProfileToNormalUser(): #uzytkownik moze zawieisc swoje konto firmowa wracajac na status konta NormalUser
pass
class ProfileView(View): class ProfileView(View):
@ -40,19 +29,57 @@ class ProfileView(View):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context["offers"] = Offer.objects.filter(created_by = self.Base_User) context["offers"] = Offer.objects.filter(created_by = self.Base_User)
return context return context
@method_decorator(login_required,name='dispatch')
@method_decorator(login_required)
def get(self,request): def get(self,request):
self.Base_User = request.user self.Base_User = request.user
return render(request,'users/profile.html', {'Base_User':Base_User}) return render(request,'users/profile.html', {'Base_User':Base_User})
def user_profile(request):
user = request.user
template_name = 'users/profile.html'
if user.status == ' Company_Account' or user.status =='Moderator':
user_offers = Offer.objects.filter(created_by = request.user).order_by('-date_added')
user_reservations = Reservation.objects.filter(user = request.user).order_by('-reservation_start_date')
return render(request,template_name, {'user':user, 'user_offers':user_offers, 'user_reservations':user_reservations})
if user.status == 'BaseAcc':
user_reservations = Reservation.objects.filter(user = request.user).order_by('-reservation_start_date')
return render(request,template_name, {'user':user,'user_reservation':user_reservations})
class EditProfile(): #edycja danych w profilu - zmiana hasłą + zmiana danych class EditProfile(): #edycja danych w profilu - zmiana hasłą + zmiana danych
pass pass
class Register_View(FormView):
def get(self,request,*args,**kwargs):
if request.user.is_authenticated:
return redirect('/profile')
else:
context = {}
form = CustomUserCreationForm()
context['form'] = form
return render(request,'users/register.html',context)
def post(self,request,*args,**kwargs):
context = {}
if request.POST:
form = CustomUserCreationForm(request.POST)
if form.is_valid():
form.save()
email = form.cleaned_data.get('email')
raw_password = form.cleaned_data.get('password1')
account = authenticate(email = email, password = raw_password)
login(request,account)
return redirect('/')
else:
context['form'] = form
else:
form = CustomUserCreationForm()
context['form'] = form
return render(request,'users/register.html', context)
class Login_View(auth_views.LoginView):
template_name = 'users/login.html'
success_url = '/profile'
def logout_view(request): def logout_view(request):
logout(request) logout(request)
messages.success(request,'Zostałeś poprawnie wylogowany') messages.success(request,'Zostałeś poprawnie wylogowany')