├── .gitignore ├── LICENSE ├── README.md ├── blog ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-37.pyc │ ├── admin.cpython-37.pyc │ ├── apps.cpython-37.pyc │ ├── models.cpython-37.pyc │ ├── urls.cpython-37.pyc │ └── views.cpython-37.pyc ├── admin.py ├── apps.py ├── migrations │ ├── __init__.py │ └── __pycache__ │ │ └── __init__.cpython-37.pyc ├── models.py ├── tests.py ├── urls.py └── views.py ├── db.sqlite3 ├── manage.py ├── media ├── default.jpg └── profile_pic │ └── DSC_0019.jpg ├── project ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-37.pyc │ ├── settings.cpython-37.pyc │ ├── urls.cpython-37.pyc │ └── wsgi.cpython-37.pyc ├── asgi.py ├── settings.py ├── urls.py └── wsgi.py ├── requirements.txt ├── templates ├── base.html ├── index.html └── users │ ├── address_info.html │ ├── login.html │ ├── logout.html │ ├── password_reset.html │ ├── password_reset_complete.html │ ├── password_reset_confirm.html │ ├── password_reset_done.html │ ├── profile.html │ ├── profile_base.html │ ├── profile_info.html │ └── register.html └── users ├── __init__.py ├── __pycache__ ├── __init__.cpython-37.pyc ├── admin.cpython-37.pyc ├── apps.cpython-37.pyc ├── forms.cpython-37.pyc ├── models.cpython-37.pyc ├── signals.cpython-37.pyc ├── urls.cpython-37.pyc └── views.cpython-37.pyc ├── admin.py ├── apps.py ├── forms.py ├── migrations ├── 0001_initial.py ├── __init__.py └── __pycache__ │ ├── 0001_initial.cpython-37.pyc │ └── __init__.cpython-37.pyc ├── models.py ├── signals.py ├── tests.py ├── urls.py └── views.py /.gitignore: -------------------------------------------------------------------------------- 1 | none 2 | **env -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### Welcome to Django-authentication 2 | 3 | #### What have this project ? 4 | ``` 5 | 1. Django Custom User-authentication With Django signal 6 | 7 | 2. django Profile_pic with Images Cropper [MODAL TO CROP THE IMAGE TAMPLATE NAME 'profile.html'] 8 | 9 | 3. django-intl-tel-input 10 | 11 | 4. django-phonenumber-field 12 | 13 | 5. Custom Users address 14 | ``` 15 | ![Optional Text](https://github.com/mohammadfayaj/Django-authentication/blob/mohammadfayaj-patch-1/Screenshot%20(13).png) 16 | ![Optional Text](https://github.com/mohammadfayaj/Django-authentication/blob/mohammadfayaj-patch-1/Screenshot%20(15).png) 17 | 18 | How To Install ? 19 | ``` 20 | Just clone:- https://github.com/mohammadfayaj/Django-authentication.git 21 | 22 | Create virtualenv , activate virtualenv [ (your virtulenv dir name)/scripts/activate ] 23 | 24 | pip install -r requirements.txt 25 | 26 | python manage.py runserver 27 | 28 | http://127.0.0.1:8000/ 29 | 30 | 31 | ``` 32 | -------------------------------------------------------------------------------- /blog/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/blog/__init__.py -------------------------------------------------------------------------------- /blog/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/blog/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /blog/__pycache__/admin.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/blog/__pycache__/admin.cpython-37.pyc -------------------------------------------------------------------------------- /blog/__pycache__/apps.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/blog/__pycache__/apps.cpython-37.pyc -------------------------------------------------------------------------------- /blog/__pycache__/models.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/blog/__pycache__/models.cpython-37.pyc -------------------------------------------------------------------------------- /blog/__pycache__/urls.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/blog/__pycache__/urls.cpython-37.pyc -------------------------------------------------------------------------------- /blog/__pycache__/views.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/blog/__pycache__/views.cpython-37.pyc -------------------------------------------------------------------------------- /blog/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /blog/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class BlogConfig(AppConfig): 5 | name = 'blog' 6 | -------------------------------------------------------------------------------- /blog/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/blog/migrations/__init__.py -------------------------------------------------------------------------------- /blog/migrations/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/blog/migrations/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /blog/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /blog/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /blog/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | app_name = "blog" 5 | 6 | urlpatterns = [ 7 | path('' , views.index, name = 'blog-home'), 8 | ] 9 | -------------------------------------------------------------------------------- /blog/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | 5 | def index(request): 6 | return render(request, 'index.html') -------------------------------------------------------------------------------- /db.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/db.sqlite3 -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /media/default.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/media/default.jpg -------------------------------------------------------------------------------- /media/profile_pic/DSC_0019.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/media/profile_pic/DSC_0019.jpg -------------------------------------------------------------------------------- /project/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/project/__init__.py -------------------------------------------------------------------------------- /project/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/project/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /project/__pycache__/settings.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/project/__pycache__/settings.cpython-37.pyc -------------------------------------------------------------------------------- /project/__pycache__/urls.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/project/__pycache__/urls.cpython-37.pyc -------------------------------------------------------------------------------- /project/__pycache__/wsgi.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/project/__pycache__/wsgi.cpython-37.pyc -------------------------------------------------------------------------------- /project/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for project project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.1/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /project/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for project project. 3 | 4 | Generated by 'django-admin startproject' using Django 3.1. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.1/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/3.1/ref/settings/ 11 | """ 12 | 13 | from pathlib import Path 14 | import os 15 | # Build paths inside the project like this: BASE_DIR / 'subdir'. 16 | BASE_DIR = Path(__file__).resolve(strict=True).parent.parent 17 | 18 | 19 | # Quick-start development settings - unsuitable for production 20 | # See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/ 21 | 22 | # SECURITY WARNING: keep the secret key used in production secret! 23 | SECRET_KEY = 'ipkljp=5dc^l-btz81p1x$sew_keifuhhif_xi1%*7&dm6$*r+' 24 | 25 | # SECURITY WARNING: don't run with debug turned on in production! 26 | DEBUG = True 27 | 28 | ALLOWED_HOSTS = [] 29 | 30 | CRISPY_TEMPLATE_PACK = 'bootstrap4' 31 | 32 | # Application definition 33 | 34 | INSTALLED_APPS = [ 35 | # projects apps 36 | 'users.apps.UsersConfig', 37 | 'blog.apps.BlogConfig', 38 | 'crispy_forms', 39 | 'django_cleanup.apps.CleanupConfig', 40 | 'intl_tel_input', 41 | 'phonenumber_field', 42 | #------------------------------- 43 | 'django.contrib.admin', 44 | 'django.contrib.auth', 45 | 'django.contrib.contenttypes', 46 | 'django.contrib.sessions', 47 | 'django.contrib.messages', 48 | 'django.contrib.staticfiles', 49 | 50 | ] 51 | 52 | MIDDLEWARE = [ 53 | 'django.middleware.security.SecurityMiddleware', 54 | 'django.contrib.sessions.middleware.SessionMiddleware', 55 | 'django.middleware.common.CommonMiddleware', 56 | 'django.middleware.csrf.CsrfViewMiddleware', 57 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 58 | 'django.contrib.messages.middleware.MessageMiddleware', 59 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 60 | ] 61 | 62 | ROOT_URLCONF = 'project.urls' 63 | 64 | TEMPLATES = [ 65 | { 66 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 67 | 'DIRS': [os.path.join(BASE_DIR, 'templates'),], 68 | 'APP_DIRS': True, 69 | 'OPTIONS': { 70 | 'context_processors': [ 71 | 'django.template.context_processors.debug', 72 | 'django.template.context_processors.request', 73 | 'django.contrib.auth.context_processors.auth', 74 | 'django.contrib.messages.context_processors.messages', 75 | ], 76 | }, 77 | }, 78 | ] 79 | 80 | WSGI_APPLICATION = 'project.wsgi.application' 81 | 82 | 83 | # Database 84 | # https://docs.djangoproject.com/en/3.1/ref/settings/#databases 85 | 86 | DATABASES = { 87 | 'default': { 88 | 'ENGINE': 'django.db.backends.sqlite3', 89 | 'NAME': BASE_DIR / 'db.sqlite3', 90 | } 91 | } 92 | 93 | 94 | # Password validation 95 | # https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators 96 | 97 | AUTH_PASSWORD_VALIDATORS = [ 98 | { 99 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 100 | }, 101 | { 102 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 103 | }, 104 | { 105 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 106 | }, 107 | { 108 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 109 | }, 110 | ] 111 | 112 | 113 | # Internationalization 114 | # https://docs.djangoproject.com/en/3.1/topics/i18n/ 115 | 116 | LANGUAGE_CODE = 'en-us' 117 | 118 | TIME_ZONE = 'UTC' 119 | 120 | USE_I18N = True 121 | 122 | USE_L10N = True 123 | 124 | USE_TZ = True 125 | 126 | 127 | 128 | # Static files (CSS, JavaScript, Images) 129 | # https://docs.djangoproject.com/en/3.1/howto/static-files/ 130 | 131 | MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 132 | MEDIA_URL = '/media/' 133 | 134 | LOGIN_REDIRECT_URL = 'blog:blog-home' 135 | 136 | STATIC_URL = 'static/' 137 | 138 | STATICFILES_DIRS = ( 139 | os.path.join(BASE_DIR, 'static'), 140 | ) 141 | 142 | 143 | EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' 144 | EMAIL_HOST = 'smtp.gmail.com' 145 | EMAIL_PORT = 587 146 | EMAIL_USE_TLS = True 147 | EMAIL_HOST_USER = 'example@gmail.com' 148 | EMAIL_HOST_PASSWORD = 'password7441564' 149 | -------------------------------------------------------------------------------- /project/urls.py: -------------------------------------------------------------------------------- 1 | """project URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/3.1/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.contrib import admin 17 | from django.urls import path,include 18 | from django.conf import settings 19 | from django.conf.urls.static import static 20 | 21 | urlpatterns = [ 22 | path('users/', include('users.urls',)), 23 | path('', include('blog.urls', namespace='blog')), 24 | path('admin/', admin.site.urls), 25 | 26 | ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) -------------------------------------------------------------------------------- /project/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for project project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.1/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | asgiref==3.2.10 2 | astroid==2.4.2 3 | autopep8==1.5.4 4 | Babel==2.8.0 5 | Django==3.1 6 | django-appconf==1.0.4 7 | django-cleanup==5.0.0 8 | django-crispy-forms==1.9.2 9 | django-intl-tel-input==0.3.1 10 | django-phonenumber-field==5.0.0 11 | lazy-object-proxy==1.4.3 12 | phonenumbers==8.12.9 13 | Pillow==7.2.0 14 | pycodestyle==2.6.0 15 | pylint==2.5.3 16 | pytz==2020.4 17 | six==1.15.0 18 | sqlparse==0.3.1 19 | toml==0.10.1 20 | -------------------------------------------------------------------------------- /templates/base.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | Djnago Authentication 13 | 14 | 15 | 16 | 17 | 47 | 48 |
49 | {% if user.is_authenticated %} 50 | 51 | 52 | {% endif %} 53 |
54 | 55 |
56 | 58 |
59 | 60 | 61 | 62 | {% block content %} 63 | 64 | {% endblock %} 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% load static %} 3 | 4 | 5 | {% block content %} 6 | 7 | {% endblock %} -------------------------------------------------------------------------------- /templates/users/address_info.html: -------------------------------------------------------------------------------- 1 | {% extends 'users/profile.html' %} 2 | {% load static %} 3 | {% load crispy_forms_tags %} 4 | 5 | {% block address_info %} 6 | 82 |
83 | {% csrf_token %} 84 |
85 |
86 | {{ address_info_form.first_name|as_crispy_field }} 87 |
88 |
89 | {{ address_info_form.last_name|as_crispy_field }} 90 |
91 |
92 |
93 |
94 | {{ address_info_form.phone_number|as_crispy_field }} 95 |
96 |
97 | {{ address_info_form.house_number|as_crispy_field }} 98 |
99 |
100 |
101 |
102 | {{ address_info_form.division|as_crispy_field }} 103 |
104 |
105 | {{ address_info_form.city|as_crispy_field }} 106 |
107 |
108 | {{ address_info_form.zone|as_crispy_field }} 109 |
110 |
111 | {{ address_info_form.effective_delivery|as_crispy_field }} 112 |
113 |
114 | 117 | 118 | Back 119 | 120 |
121 | 140 | {% endblock %} 141 | -------------------------------------------------------------------------------- /templates/users/login.html: -------------------------------------------------------------------------------- 1 | {% extends 'users/base.html' %} 2 | {% load static %} 3 | {% load crispy_forms_tags%} 4 | {% block content %} 5 | 6 | 48 | 49 | {% endblock %} -------------------------------------------------------------------------------- /templates/users/logout.html: -------------------------------------------------------------------------------- 1 | {% extends "users/base.html" %} 2 | {% block content %} 3 |
4 |

You have been logged out

5 | 6 | Log In Again 7 | 8 |
9 | {% endblock content %} 10 | -------------------------------------------------------------------------------- /templates/users/password_reset.html: -------------------------------------------------------------------------------- 1 | {% extends 'users/base.html' %} 2 | {% load static %} 3 | {% load crispy_forms_tags%} 4 | {% block content %} 5 | 6 | 36 | 37 | {% endblock %} -------------------------------------------------------------------------------- /templates/users/password_reset_complete.html: -------------------------------------------------------------------------------- 1 | {% extends "users/base.html" %} 2 | {% block content %} 3 |
4 |

Your password has been set.You may go ahead and log in now.

5 | 6 | Log In 7 | 8 |
9 | {% endblock content %} -------------------------------------------------------------------------------- /templates/users/password_reset_confirm.html: -------------------------------------------------------------------------------- 1 | {% extends "users/base.html" %} 2 | {% load i18n static %} 3 | {% load crispy_forms_tags %} 4 | {% block content %} 5 | 6 |
7 | {% if validlink %} 8 | 9 |

Please enter your new password twice so we can verify you typed it in correctly.

10 | 11 |
12 | {% csrf_token %} 13 |
14 | Reset Password 15 | {{ form|crispy }} 16 |
17 |
18 | 19 |
20 |
21 | 22 | {% else %} 23 | 24 |

"The password reset link was invalid, possibly because it has already been used. Please request a new password 25 | reset."

26 | 27 | {% endif %} 28 |
29 | {% endblock %} -------------------------------------------------------------------------------- /templates/users/password_reset_done.html: -------------------------------------------------------------------------------- 1 | {% extends "users/base.html" %} 2 | {% block content %} 3 |
4 | 'We’ve emailed you instructions for setting your password, 5 | if an account exists with the email you entered. You should receive them shortly.' 6 |

Please Check All mail If you don’t see an email.

7 |
8 |

If you don’t receive an email, 9 | please make sure you’ve entered the address you registered with, 10 | and check your spam folder.

11 | {% endblock content %} -------------------------------------------------------------------------------- /templates/users/profile.html: -------------------------------------------------------------------------------- 1 | {% extends 'users/profile_base.html' %} 2 | {% load static %} 3 | {% load crispy_forms_tags%} 4 | 5 | 6 | {% block content %} 7 | 8 |
9 | 10 |
11 | 12 |
17 | 18 | 19 | 20 |
21 |

{{user.username}}

22 | {{user.email}} 23 |
24 |

I am a Professional Web developer

25 |
26 |
27 | {% csrf_token %} 28 | {{ form|crispy }} 29 |
30 | Change Password 31 |
32 |
33 | 34 |
35 |
36 | 37 |
38 |
39 | Update Profile Information! 40 |
41 |
42 | 43 | Profile Setting 44 | Address Book
45 | 51 | 52 | 53 | {% block profile_info %} 54 | 55 | {% endblock %} 56 | 57 | {% block address_info %} 58 | 59 | {% endblock %} 60 | 61 |
62 |
63 | 64 |
65 |
66 | 67 | 68 | 81 | 82 | 83 | 143 | 144 | {% endblock %} 145 | 146 | -------------------------------------------------------------------------------- /templates/users/profile_base.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | {% load crispy_forms_tags %} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 17 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 74 | {% block content %} 75 | 76 | {% endblock %} 77 | 79 | 81 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /templates/users/profile_info.html: -------------------------------------------------------------------------------- 1 | {% extends 'users/profile.html' %} 2 | {% load static %} 3 | {% load crispy_forms_tags%} 4 | 5 | 6 | {% block profile_info %} 7 | 8 | 21 | 22 |
23 | {% csrf_token %} 24 | {{ user_update_form|crispy }} 25 | 26 | Back 27 | 28 |
29 | 30 | {% endblock %} -------------------------------------------------------------------------------- /templates/users/register.html: -------------------------------------------------------------------------------- 1 | {% extends 'users/base.html' %} 2 | {% load static %} 3 | {% load crispy_forms_tags%} 4 | {% block content %} 5 | 6 | 7 | 41 | 42 | 43 | {% endblock %} -------------------------------------------------------------------------------- /users/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/users/__init__.py -------------------------------------------------------------------------------- /users/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/users/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /users/__pycache__/admin.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/users/__pycache__/admin.cpython-37.pyc -------------------------------------------------------------------------------- /users/__pycache__/apps.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/users/__pycache__/apps.cpython-37.pyc -------------------------------------------------------------------------------- /users/__pycache__/forms.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/users/__pycache__/forms.cpython-37.pyc -------------------------------------------------------------------------------- /users/__pycache__/models.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/users/__pycache__/models.cpython-37.pyc -------------------------------------------------------------------------------- /users/__pycache__/signals.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/users/__pycache__/signals.cpython-37.pyc -------------------------------------------------------------------------------- /users/__pycache__/urls.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/users/__pycache__/urls.cpython-37.pyc -------------------------------------------------------------------------------- /users/__pycache__/views.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/users/__pycache__/views.cpython-37.pyc -------------------------------------------------------------------------------- /users/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Profile,Address 3 | # Register your models here. 4 | 5 | admin.site.register(Profile) 6 | 7 | admin.site.register(Address) 8 | -------------------------------------------------------------------------------- /users/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class UsersConfig(AppConfig): 5 | name = 'users' 6 | 7 | def ready(self): 8 | import users.signals 9 | -------------------------------------------------------------------------------- /users/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from django.contrib.auth.models import User 3 | from django.contrib.auth.forms import UserCreationForm 4 | from PIL import Image 5 | from django.core.files import File 6 | from users.models import Profile,Address 7 | from intl_tel_input.widgets import IntlTelInputWidget 8 | from phonenumber_field.modelfields import PhoneNumberField 9 | from phonenumber_field.widgets import PhoneNumberPrefixWidget 10 | 11 | class AddressForm(forms.ModelForm): 12 | class Meta: 13 | model = Address 14 | fields = ('first_name', 'last_name', 'phone_number' , 'house_number', 'division', 'city', 'zone', 'effective_delivery' ) 15 | widgets = { 16 | 17 | 'phone_number' :PhoneNumberPrefixWidget(attrs= 18 | {'placeholder': (u'Phone Number'),'id':'tel' ,'class': "form-control", 'label':(u'Cellphone number')}), 19 | } 20 | 21 | class ProfileUpdateForm(forms.ModelForm): 22 | x = forms.FloatField(widget=forms.HiddenInput()) 23 | y = forms.FloatField(widget=forms.HiddenInput()) 24 | width = forms.FloatField(widget=forms.HiddenInput()) 25 | height = forms.FloatField(widget=forms.HiddenInput()) 26 | 27 | class Meta: 28 | model = Profile 29 | fields = ('file', 'x', 'y', 'width', 'height', ) 30 | widgets = { 31 | 'file': forms.FileInput(attrs={ 32 | 'accept': 'image/*' # this is not an actual validation! don't rely on that! 33 | }) 34 | } 35 | 36 | def save(self): 37 | photo = super(ProfileUpdateForm, self).save() 38 | 39 | x = self.cleaned_data.get('x') 40 | y = self.cleaned_data.get('y') 41 | w = self.cleaned_data.get('width') 42 | h = self.cleaned_data.get('height') 43 | 44 | image = Image.open(photo.file) 45 | cropped_image = image.crop((x, y, w+x, h+y)) 46 | resized_image = cropped_image.resize((400, 400), Image.ANTIALIAS) 47 | resized_image.save(photo.file.path) 48 | 49 | return photo 50 | 51 | 52 | class UserRegisterForm(UserCreationForm): 53 | email = forms.EmailField() 54 | username = forms.CharField(label='Enter Username', help_text='* Username should not have any space' , min_length=4, max_length=150) 55 | 56 | class Meta: 57 | model = User 58 | fields = ['username', 'email', 'password1', 'password2'] 59 | 60 | 61 | class UserUpdateForm(forms.ModelForm): 62 | email = forms.EmailField() 63 | username = forms.CharField(label='Enter Username', help_text='* Username should not have any space' , min_length=4, max_length=150) 64 | class Meta: 65 | model = User 66 | fields = ['username', 'email',] 67 | -------------------------------------------------------------------------------- /users/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.1 on 2020-09-29 13:51 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | import phonenumber_field.modelfields 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | initial = True 12 | 13 | dependencies = [ 14 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 15 | ] 16 | 17 | operations = [ 18 | migrations.CreateModel( 19 | name='Profile', 20 | fields=[ 21 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 22 | ('file', models.ImageField(default='default.jpg', upload_to='profile_pic')), 23 | ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 24 | ], 25 | ), 26 | migrations.CreateModel( 27 | name='Address', 28 | fields=[ 29 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 30 | ('first_name', models.CharField(blank=True, max_length=30, null=True)), 31 | ('last_name', models.CharField(blank=True, max_length=30, null=True)), 32 | ('phone_number', phonenumber_field.modelfields.PhoneNumberField(blank=True, help_text='Please Enter Your Valid Phone Number.', max_length=128, null=True, region=None)), 33 | ('house_number', models.CharField(blank=True, help_text='Your Village Name And House Number', max_length=32, null=True)), 34 | ('division', models.CharField(blank=True, choices=[('Dhaka', 'Dhaka'), ('Chittagong', 'Chittagong'), ('Barisal', 'Barisal'), ('Khulna', 'Khulna'), ('Mymensingh', 'Mymensingh'), ('Rajshahi', 'Rajshahi'), ('Rangpur', 'Rangpur'), ('Sylhet', 'Sylhet')], max_length=15, null=True)), 35 | ('effective_delivery', models.CharField(blank=True, choices=[('H', 'Home'), ('O', 'Office')], default='H', max_length=30, null=True)), 36 | ('city', models.CharField(blank=True, max_length=30, null=True)), 37 | ('zone', models.CharField(blank=True, max_length=30, null=True)), 38 | ('users', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 39 | ], 40 | ), 41 | ] 42 | -------------------------------------------------------------------------------- /users/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/users/migrations/__init__.py -------------------------------------------------------------------------------- /users/migrations/__pycache__/0001_initial.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/users/migrations/__pycache__/0001_initial.cpython-37.pyc -------------------------------------------------------------------------------- /users/migrations/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohammadfayaj/Django-Custom_Authentication/3aecb0640bb4cd9b9e0e614fd9660172db5bf4dd/users/migrations/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /users/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.conf import settings 3 | from django.contrib.auth.models import User 4 | from PIL import Image 5 | from intl_tel_input.widgets import IntlTelInputWidget 6 | from phonenumber_field.modelfields import PhoneNumberField 7 | from phonenumber_field.widgets import PhoneNumberPrefixWidget 8 | 9 | 10 | class Profile (models.Model): 11 | user = models.OneToOneField(User, on_delete=models.CASCADE) 12 | file = models.ImageField(default='default.jpg', upload_to="profile_pic") 13 | 14 | def __str__(self): 15 | return f'{self.user.username} Profile' 16 | 17 | 18 | DIVISION = [ 19 | 20 | ('Dhaka', 'Dhaka'), 21 | ('Chittagong', 'Chittagong'), 22 | ('Barisal', 'Barisal'), 23 | ('Khulna', 'Khulna'), 24 | ('Mymensingh', 'Mymensingh'), 25 | ('Rajshahi', 'Rajshahi'), 26 | ('Rangpur', 'Rangpur'), 27 | ('Sylhet', 'Sylhet'), 28 | ] 29 | 30 | DELIVERY = [ 31 | ('H', 'Home'), 32 | ('O', 'Office') 33 | ] 34 | 35 | 36 | class Address (models.Model): 37 | users = models.OneToOneField(User, on_delete=models.CASCADE) 38 | first_name = models.CharField(max_length=30, blank=True, null=True) 39 | last_name = models.CharField(max_length=30, blank=True, null=True) 40 | phone_number = PhoneNumberField(blank=True, null=True, help_text='Please Enter Your Valid Phone Number.',) 41 | house_number = models.CharField(max_length=32, blank=True, null=True, help_text='Your Village Name And House Number') 42 | division = models.CharField(max_length=15, choices=DIVISION, blank=True, null=True) 43 | effective_delivery = models.CharField(max_length=30, choices=DELIVERY, blank=True, null=True, default='H') 44 | city = models.CharField(max_length=30, blank=True, null=True) 45 | zone = models.CharField(max_length=30, blank=True, null=True) 46 | 47 | def __str__(self): 48 | return f'{self.users.username} Address' 49 | -------------------------------------------------------------------------------- /users/signals.py: -------------------------------------------------------------------------------- 1 | from django.db.models.signals import post_save 2 | from django.contrib.auth.models import User 3 | from django.dispatch import receiver 4 | from .models import Profile,Address 5 | 6 | 7 | @receiver(post_save, sender=User) 8 | def create_profile(sender, instance, created, **kwargs): 9 | if created: 10 | Profile.objects.create(user=instance) 11 | print('User Created ..........!') 12 | 13 | 14 | @receiver(post_save, sender=User) 15 | def save_profile(sender, instance, **kwargs): 16 | instance.profile.save() 17 | print('user Updated...!') 18 | 19 | 20 | @receiver(post_save, sender=User) 21 | def create_address(sender, instance, created, **kwargs): 22 | if created: 23 | Address.objects.create(users=instance) 24 | print("Address Created...!") 25 | 26 | 27 | @receiver(post_save, sender=User) 28 | def save_Address(sender,instance,created ,**kwargs): 29 | instance.address.save() 30 | print('address updated..!') -------------------------------------------------------------------------------- /users/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /users/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from django.urls import reverse_lazy 3 | from .import views 4 | from django.contrib.auth import views as auth_views 5 | from users import views as user_views 6 | 7 | 8 | 9 | urlpatterns = [ 10 | path('address_info/', views.address_info , name='users-address-info'), 11 | 12 | path('', views.register , name='users-register'), 13 | path('login/', auth_views.LoginView.as_view(template_name='users/login.html'),name='users-login'), 14 | path('logout/', auth_views.LogoutView.as_view(template_name='users/logout.html'),name='users-logout'), 15 | path('profile/', views.profile , name='users-profile'), 16 | path('profile_info/', views.profile_info , name='users-profile-info'), 17 | 18 | 19 | path('change-password/', auth_views.PasswordChangeView.as_view 20 | (template_name='users/change-password.html'), name = 'password_change'), 21 | 22 | path('change-password/done/', auth_views.PasswordChangeDoneView.as_view 23 | (template_name='users/change-password-done.html'), name = 'password_change_done'), 24 | 25 | path('password-reset/',auth_views.PasswordResetView.as_view 26 | (template_name='users/password_reset.html'),name='password_reset'), 27 | 28 | path('password-reset/done',auth_views.PasswordResetDoneView.as_view 29 | (template_name='users/password_reset_done.html'),name='password_reset_done'), 30 | 31 | path('password-reset-confirm///', 32 | auth_views.PasswordResetConfirmView.as_view( 33 | template_name='users/password_reset_confirm.html' 34 | ), 35 | name='password_reset_confirm'), 36 | 37 | 38 | path('password-reset-complete/',auth_views.PasswordResetCompleteView.as_view 39 | (template_name='users/password_reset_complete.html'),name=('password_reset_complete')), 40 | 41 | ] 42 | 43 | -------------------------------------------------------------------------------- /users/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render, redirect 2 | from django.contrib import messages 3 | from django.contrib.auth.decorators import login_required 4 | from .forms import UserRegisterForm, UserUpdateForm, ProfileUpdateForm, AddressForm 5 | from.models import Profile, Address 6 | 7 | 8 | def register(request): 9 | if request.method == 'POST': 10 | form = UserRegisterForm(request.POST) 11 | if form.is_valid(): 12 | form.save() 13 | username = form.cleaned_data.get('username') 14 | messages.success(request, f'Account created for {username}!') 15 | return redirect('users-login') 16 | else: 17 | form = UserRegisterForm() 18 | return render(request, 'users/register.html', {'form': form}) 19 | 20 | 21 | @login_required 22 | def profile(request): 23 | photos = Profile.objects.all() 24 | if request.method == "POST": 25 | form = ProfileUpdateForm( 26 | request.POST, request.FILES, instance=request.user.profile) 27 | if form.is_valid(): 28 | form.save() 29 | return redirect('users-profile') 30 | else: 31 | pass 32 | form = ProfileUpdateForm(instance=request.user.profile) 33 | context = { 34 | 'form': form, 35 | 'photos': photos, 36 | } 37 | return render(request, 'users/profile.html', context) 38 | 39 | 40 | @login_required 41 | def profile_info(request): 42 | photos = Profile.objects.all() 43 | if request.method == "POST": 44 | user_update_form = UserUpdateForm(request.POST, instance=request.user) 45 | if user_update_form.is_valid(): 46 | user_update_form.save() 47 | return redirect('users-profile') 48 | else: 49 | user_update_form = UserUpdateForm(instance=request.user) 50 | 51 | context = { 52 | "user_update_form": user_update_form, 53 | "photos": photos 54 | 55 | } 56 | return render(request, 'users/profile_info.html', context) 57 | 58 | 59 | @login_required 60 | def address_info(request): 61 | address_info_list = Address.objects.all() 62 | if request.method == "POST": 63 | address_info_form = AddressForm(request.POST, instance=request.user.address) 64 | if address_info_form.is_valid(): 65 | address_info_form.save() 66 | return redirect('users-profile') 67 | else: 68 | address_info_form = AddressForm(instance=request.user.address) 69 | context = { 70 | "address_info_list": address_info_list, 71 | "address_info_form": address_info_form 72 | } 73 | return render(request, 'users/address_info.html', context) 74 | --------------------------------------------------------------------------------