Update users app, add login/registser/profile template
This commit is contained in:
parent
c1721595ee
commit
7de2d58b80
@ -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'>
|
||||||
|
@ -13,17 +13,19 @@
|
|||||||
</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 %}
|
||||||
|
@ -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 %}
|
|
||||||
|
|
@ -1,20 +1,43 @@
|
|||||||
{% 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'>
|
||||||
{% endblock content %}
|
|
||||||
|
|
||||||
{% if offer.status != 'Active'%}
|
{% if offer.status != 'Active'%}
|
||||||
<h1> OFERTA NIEKATYWNA </h1>
|
<span class='offer-detail-status-info'> OFERTA NIEAKTYWNA </span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class='offer-detail-title'>
|
||||||
|
<span class='offer-detail-title-text'> {{offer.title}} </span>
|
||||||
|
</div>
|
||||||
|
|
||||||
<h1> {{ offer.title }} </h1>
|
<div class='offer-detail-images'>
|
||||||
{{offer.created_by}}
|
<div class='offer-detail-images-img-thumbnail'>
|
||||||
<p> {{ offer.price }} PLN / dzień</p>
|
{% 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>
|
<ul>
|
||||||
<li> 'DMC' <b> {{offer.DMC}} </b> </li>
|
<li> 'DMC' <b> {{offer.DMC}} </b> </li>
|
||||||
<li> 'Places_to_sleep' <b> {{offer.Places_to_sleep}} </b></li>
|
<li> 'Places_to_sleep' <b> {{offer.Places_to_sleep}} </b></li>
|
||||||
@ -29,11 +52,28 @@
|
|||||||
<li> 'gearbox <b> {{offer.gearbox}} </b> </li>
|
<li> 'gearbox <b> {{offer.gearbox}} </b> </li>
|
||||||
<li> 'tempomat' <b> {{offer.tempomat}} </b> </li>
|
<li> 'tempomat' <b> {{offer.tempomat}} </b> </li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
<h2> THUMBNAIL </h2>
|
</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 %}
|
||||||
|
|
||||||
|
|
||||||
<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
41
vagus/template/users/login.html
Executable 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 %}
|
@ -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>
|
||||||
|
<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 %}
|
{% 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>
|
||||||
|
41
vagus/template/users/register.html
Executable file
41
vagus/template/users/register.html
Executable 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 %}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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',)
|
||||||
|
@ -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']
|
@ -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)),
|
||||||
],
|
],
|
||||||
|
@ -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'),
|
|
||||||
),
|
|
||||||
]
|
|
21
vagus/users/migrations/0002_auto_20210205_1512.py
Executable file
21
vagus/users/migrations/0002_auto_20210205_1512.py
Executable 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',
|
||||||
|
),
|
||||||
|
]
|
@ -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'),
|
|
||||||
),
|
|
||||||
]
|
|
@ -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),
|
|
||||||
),
|
|
||||||
]
|
|
@ -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),
|
|
||||||
),
|
|
||||||
]
|
|
@ -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),
|
|
||||||
),
|
|
||||||
]
|
|
Binary file not shown.
BIN
vagus/users/migrations/__pycache__/0002_auto_20210205_1512.cpython-37.pyc
Executable file
BIN
vagus/users/migrations/__pycache__/0002_auto_20210205_1512.cpython-37.pyc
Executable file
Binary file not shown.
BIN
vagus/users/migrations/__pycache__/0007_remove_base_user_phone.cpython-37.pyc
Executable file
BIN
vagus/users/migrations/__pycache__/0007_remove_base_user_phone.cpython-37.pyc
Executable file
Binary file not shown.
Binary file not shown.
@ -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'
|
||||||
@ -69,13 +66,6 @@ class Base_User(AbstractBaseUser,PermissionsMixin):
|
|||||||
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):
|
||||||
user = models.OneToOneField(Base_User, on_delete=models.CASCADE,null = True)
|
user = models.OneToOneField(Base_User, on_delete=models.CASCADE,null = True)
|
||||||
company_name = models.CharField(_('Company name'), max_length=30, blank= True)
|
company_name = models.CharField(_('Company name'), max_length=30, blank= True)
|
||||||
|
@ -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'),
|
||||||
]
|
]
|
@ -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')
|
||||||
|
Loading…
Reference in New Issue
Block a user