user profile update

This commit is contained in:
mahdavi 2022-09-08 18:08:22 +04:30
parent ba6507c8f9
commit 7a6576fce1
12 changed files with 124 additions and 10 deletions

View file

@ -45,6 +45,8 @@ INSTALLED_APPS = [
'apps.wallet', 'apps.wallet',
'apps.gooyal_oauth2', 'apps.gooyal_oauth2',
'apps.superapp', 'apps.superapp',
'crispy_forms',
'crispy_bootstrap5',
] ]
MIDDLEWARE = [ MIDDLEWARE = [
@ -194,6 +196,9 @@ STATIC_URL = '/static/'
# CLIENT_ID = config('CLIENT_ID') # CLIENT_ID = config('CLIENT_ID')
# CLIENT_SECRET = config('CLIENT_SECRET') # CLIENT_SECRET = config('CLIENT_SECRET')
CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5"
CRISPY_TEMPLATE_PACK = "bootstrap5"
CELERY_BROKER_URL = config('CELERY_BROKER_URL') CELERY_BROKER_URL = config('CELERY_BROKER_URL')
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

View file

@ -82,3 +82,9 @@ class OTPAuthenticationForm(forms.Form):
code='invalid_login', code='invalid_login',
params={'phone_number': self.phone_number_field.verbose_name}, params={'phone_number': self.phone_number_field.verbose_name},
) )
class ProfileUpdateForm(forms.ModelForm):
class Meta:
model = UserModel
fields = ['name', 'first_name', 'last_name', 'email', 'iban', 'avatar']

View file

@ -0,0 +1,18 @@
# Generated by Django 4.1 on 2022-09-08 13:01
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='user',
name='email_verified',
field=models.BooleanField(null=True),
),
]

View file

@ -67,6 +67,7 @@ class User(AbstractUser):
first_name = models.CharField(_('first name'), max_length=30, blank=True) first_name = models.CharField(_('first name'), max_length=30, blank=True)
last_name = models.CharField(_('last name'), max_length=150, blank=True) last_name = models.CharField(_('last name'), max_length=150, blank=True)
email = models.EmailField(_('email address'), blank=True) email = models.EmailField(_('email address'), blank=True)
email_verified = models.BooleanField(null=True)
# country = models.CharField(_('country'), max_length=50, blank=True, null=True) # country = models.CharField(_('country'), max_length=50, blank=True, null=True)
# province = models.CharField(_('province'), max_length=50, blank=True, null=True) # province = models.CharField(_('province'), max_length=50, blank=True, null=True)

View file

@ -1,14 +1,15 @@
from django.urls import path from django.urls import path
from django.contrib.auth.views import LogoutView from django.contrib.auth.views import LogoutView
from .views import UserListView, UserDetailView, AccountView, RequestOTPView, ChangePasswordView, \ from .views import UserListView, UserDetailView, AccountView, RequestOTPView, ChangePasswordView, \
OTPLoginView, ProfileView OTPLoginView, ProfileDetailView, ProfileUpdateView
app_name = "users" app_name = "users"
urlpatterns = [ urlpatterns = [
path('login/', OTPLoginView.as_view(), name='login'), path('login/', OTPLoginView.as_view(), name='login'),
path('logout/', LogoutView.as_view(), name='logout'), path('logout/', LogoutView.as_view(), name='logout'),
path('profile/', ProfileView.as_view(), name='profile'), path('profile/', ProfileDetailView.as_view(), name='profile_detail'),
path('profile/update/', ProfileUpdateView.as_view(), name='profile_update'),
path('api/account/', AccountView.as_view(), name='account_api'), path('api/account/', AccountView.as_view(), name='account_api'),
path('api/users/', UserListView.as_view(), name='user_list_api'), path('api/users/', UserListView.as_view(), name='user_list_api'),
path('api/users/<uuid>/', UserDetailView.as_view(), name='user_detail_api'), path('api/users/<uuid>/', UserDetailView.as_view(), name='user_detail_api'),

View file

@ -2,6 +2,7 @@ from django.contrib.auth import get_user_model
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.contrib.auth.views import LoginView from django.contrib.auth.views import LoginView
from django.shortcuts import render from django.shortcuts import render
from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from django.views.generic import DetailView, UpdateView from django.views.generic import DetailView, UpdateView
@ -11,7 +12,7 @@ from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from apps.gooyal_oauth2.rest_framework import IsAuthenticatedOrTokenMatchesOASRequirements from apps.gooyal_oauth2.rest_framework import IsAuthenticatedOrTokenMatchesOASRequirements
from apps.users.forms import OTPAuthenticationForm from apps.users.forms import OTPAuthenticationForm, ProfileUpdateForm
from apps.users.models import User from apps.users.models import User
from apps.users.provinces_and_cities import State from apps.users.provinces_and_cities import State
from apps.users.serializers import PublicUserSerializer, AccountSerializer, RequestOTPSerializer, \ from apps.users.serializers import PublicUserSerializer, AccountSerializer, RequestOTPSerializer, \
@ -106,7 +107,7 @@ class OTPLoginView(LoginView):
@method_decorator(login_required, name='dispatch') @method_decorator(login_required, name='dispatch')
class ProfileView(DetailView): class ProfileDetailView(DetailView):
model = User model = User
template_name = 'users/profile_detail.html' template_name = 'users/profile_detail.html'
pk_url_kwarg = 'uuid' pk_url_kwarg = 'uuid'
@ -116,10 +117,18 @@ class ProfileView(DetailView):
@method_decorator(login_required, name='dispatch') @method_decorator(login_required, name='dispatch')
class ProfileUpdate(UpdateView): class ProfileUpdateView(UpdateView):
model = User model = User
template_name = 'users/profile_update.html' template_name = 'users/profile_update.html'
pk_url_kwarg = 'uuid' pk_url_kwarg = 'uuid'
form_class = ProfileUpdateForm
def get_success_url(self):
return reverse('users:profile_update')
def get_object(self, queryset=None): def get_object(self, queryset=None):
return self.request.user return self.request.user
def form_valid(self, form):
return super().form_valid(form)

View file

@ -14,4 +14,6 @@ gunicorn
gevent gevent
redis redis
celery celery
drf-spectacular drf-spectacular
django-crispy-forms
crispy_bootstrap5

View file

@ -34,6 +34,8 @@ click-plugins==1.1.1
# via celery # via celery
click-repl==0.2.0 click-repl==0.2.0
# via celery # via celery
crispy-bootstrap5==0.6
# via -r requirements.in
cryptography==37.0.4 cryptography==37.0.4
# via jwcrypto # via jwcrypto
deprecated==1.2.13 deprecated==1.2.13
@ -43,6 +45,7 @@ deprecated==1.2.13
django==4.1 django==4.1
# via # via
# -r requirements.in # -r requirements.in
# crispy-bootstrap5
# django-cors-headers # django-cors-headers
# django-filter # django-filter
# django-model-utils # django-model-utils
@ -52,6 +55,10 @@ django==4.1
# drf-spectacular # drf-spectacular
django-cors-headers==3.13.0 django-cors-headers==3.13.0
# via -r requirements.in # via -r requirements.in
django-crispy-forms==1.14.0
# via
# -r requirements.in
# crispy-bootstrap5
django-filter==22.1 django-filter==22.1
# via -r requirements.in # via -r requirements.in
django-model-utils==4.2.0 django-model-utils==4.2.0

39
templates/new_base.html Executable file
View file

@ -0,0 +1,39 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>Login</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="{% static 'bootstrap-5.1.3-dist/css/bootstrap.min.css' %}">
<link href="{% static 'bootstrap-icons-1.7.2/bootstrap-icons.css' %}" rel="stylesheet">
<script src="{% static 'jquery-3.6.0.min.js' %}"></script>
<script src="{% static 'bootstrap-5.1.3-dist/js/bootstrap.bundle.min.js' %}"></script>
<link rel="stylesheet" type="text/css" href="{% static 'login/css/util.css' %}">
<link rel="stylesheet" type="text/css" href="{% static 'login/css/main.css' %}">
<link href="{% static 'fonts.css' %}" rel="stylesheet">
<link href="{% static 'main.css' %}" rel="stylesheet">
<!--===============================================================================================-->
</head>
<body>
<div class="limiter">
<div class="container-login100">
<div class="wrap-login100 p-t-50 p-b-90">
{# <div class="text-center pb-5">#}
{# <img src="{% static 'image/arian_saeed.png' %}" class="img-fluid">#}
{# </div>#}
<div class="card">
<div class="card-body">
{% block content %}
{% endblock %}
</div>
</div>
</div>
</div>
</div>
</body>
</html>

View file

@ -1,4 +1,4 @@
{% extends "base_generic.html" %} {% extends "new_base.html" %}
{% block content %} {% block content %}

View file

@ -0,0 +1,9 @@
{% extends "base_generic.html" %}
{% block content %}
<h2>Homepage</h2>
<p>Hello {{ user.username }}!</p>
<p>your phone number {{ user.phone_number }}!</p>
{% endblock %}

View file

@ -1,9 +1,26 @@
{% extends "base_generic.html" %} {% extends "base_generic.html" %}
{% load crispy_forms_tags %}
{% block content %} {% block content %}
<h2>Homepage</h2> <h2>update user profile</h2>
<p>Hello {{ user.username }}!</p> <form action="{{ request.get_full_path }}" method="post" enctype="multipart/form-data">
<p>your phone number {{ user.phone_number }}!</p> {% csrf_token %}
<div class="row g-3">
<div class="col-md-12 col-lg-12 mb-3" id="formset">
<div class="card">
<div class="card-body">
{{ form|crispy }}
</div>
</div>
</div>
<div class="col-12">
<input class="w-100 btn btn-primary btn-lg" type="submit" value="ثبت" name="save"/>
</div>
{# <div class="col-6">#}
{# <input class="w-100 btn btn-primary btn-lg" type="submit" value="انتشار" name="publish"/>#}
{# </div>#}
</div>
</form>
{% endblock %} {% endblock %}