diff options
author | Sunil Shetye | 2024-05-25 07:59:48 +0530 |
---|---|---|
committer | Sunil Shetye | 2024-05-25 13:32:32 +0530 |
commit | 5da499ad70d1038ea66b30ca21e4b49ad4063fa3 (patch) | |
tree | 61b7fa4c7bc8bba4ce176e5e250ed23f036d097c | |
parent | 875de28dde75b6330e8f2b6ffd08bc6301ed6cd8 (diff) | |
download | Common-Interface-Project-5da499ad70d1038ea66b30ca21e4b49ad4063fa3.tar.gz Common-Interface-Project-5da499ad70d1038ea66b30ca21e4b49ad4063fa3.tar.bz2 Common-Interface-Project-5da499ad70d1038ea66b30ca21e4b49ad4063fa3.zip |
set username as email
-rw-r--r-- | blocks/authAPI/models.py | 31 | ||||
-rw-r--r-- | blocks/authAPI/serializers.py | 6 | ||||
-rw-r--r-- | blocks/authAPI/templates/activate_user.html | 60 | ||||
-rw-r--r-- | blocks/blocks/settings.py | 10 | ||||
-rw-r--r-- | blocks/eda-frontend/src/pages/signUp.js | 51 | ||||
-rw-r--r-- | blocks/eda-frontend/src/redux/actions/actions.js | 2 | ||||
-rw-r--r-- | blocks/eda-frontend/src/redux/actions/authActions.js | 22 | ||||
-rwxr-xr-x | blocks/init.sh | 15 |
8 files changed, 120 insertions, 77 deletions
diff --git a/blocks/authAPI/models.py b/blocks/authAPI/models.py index 7d79b7c7..b7c7275d 100644 --- a/blocks/authAPI/models.py +++ b/blocks/authAPI/models.py @@ -1,7 +1,34 @@ from django.db import models -from django.contrib.auth.models import AbstractUser +from django.contrib.auth.models import AbstractUser, BaseUserManager + + +class CustomUserManager(BaseUserManager): + """Custome user manager.""" + def create_user(self, email, username, password=None, **extra_kwargs): + """Create and saves a User with the given email, username, and password.""" + if not email: + raise ValueError("Users must have an email address") + + user = self.model(email=self.normalize_email(email), username=username) + user.set_password(password) + user.save(using=self._db) + return user + + def create_superuser(self, email, username, password=None, **extra_kwargs): + """Create and saves a superuser with the given email, username, and password.""" + + user = self.create_user(email, username, password=password) + user.is_staff = True + user.is_superuser = True + user.save(using=self._db) + return user class User(AbstractUser): id = models.AutoField(primary_key=True) - email = models.EmailField(unique=True) + email = models.EmailField(max_length=150, unique=True) + username = models.CharField(max_length=150, unique=True) + + USERNAME_FIELD = 'email' + REQUIRED_FIELDS = ['username'] + objects = CustomUserManager() diff --git a/blocks/authAPI/serializers.py b/blocks/authAPI/serializers.py index 92286aec..1bde4387 100644 --- a/blocks/authAPI/serializers.py +++ b/blocks/authAPI/serializers.py @@ -6,6 +6,12 @@ from djoser.conf import settings User = get_user_model() +class UserCreateSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = ("id", "username", "email", "password") + + class TokenCreateSerializer(serializers.Serializer): password = serializers.CharField(required=False, style={"input_type": "password"}) diff --git a/blocks/authAPI/templates/activate_user.html b/blocks/authAPI/templates/activate_user.html index 23973370..4074b96b 100644 --- a/blocks/authAPI/templates/activate_user.html +++ b/blocks/authAPI/templates/activate_user.html @@ -3,51 +3,32 @@ <head> - <!-- Basic Page Needs - –––––––––––––––––––––––––––––––––––––––––––––––––– --> + <!-- Basic Page Needs --> <meta charset="utf-8"> <title>Activate Account</title> <meta name="description" content=""> - <!-- Mobile Specific Metas - –––––––––––––––––––––––––––––––––––––––––––––––––– --> + <!-- Mobile Specific Metas --> <meta name="viewport" content="width=device-width, initial-scale=1"> - <!-- FONT - –––––––––––––––––––––––––––––––––––––––––––––––––– --> + <!-- FONT --> <link href="//fonts.googleapis.com/css?family=Raleway:400,300,600" rel="stylesheet" type="text/css"> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> - <!-- CSS - –––––––––––––––––––––––––––––––––––––––––––––––––– --> + <!-- CSS --> <link rel="stylesheet" href="/css/normalize.css"> <link rel="stylesheet" href="/css/skeleton.css"> <style> - html, - body { + html, body { min-height: 100%; } - .button { - border-color: #33C3F0; - } - - .footer { - position: absolute; - bottom: 0; - min-width: 100%; - padding: 10px; - text-align: center; - } - #clickhere { cursor: pointer; } </style> - <!-- Script - –––––––––––––––––––––––––––––––––––––––––––––––––– --> - + <!-- Script --> <script> function sendData() { @@ -56,54 +37,37 @@ data: { uid: '{{ uid }}', token: '{{ token }}' }, type: "POST", dataType: "json", - //on success success: function (data) { window.location.replace('{{ redirect_url }}'); }, - //on error error: function (err) { - // ToDo: Error message popup console.log(err) $('#error-text').text(err.statusText) - } }); } - </script> - <!-- Favicon - –––––––––––––––––––––––––––––––––––––––––––––––––– --> - <!-- <link rel="icon" type="image/png" href="images/favicon.png"> --> + <!-- Favicon --> + <link rel="icon" type="image/x-icon" href="/favicon.ico"> </head> <body> - - - <!-- Primary Page Layout - –––––––––––––––––––––––––––––––––––––––––––––––––– --> + <!-- Primary Page Layout --> <div class="container"> <div class="row"> - <div style="padding-top: 30%; align-content: center;"> + <div style="padding-top: 10%; align-content: center;"> <h1 style="text-align: center;">To Activate Your Account <a id="clickhere" onClick="sendData();"><strong><u>Click Here</u><strong></a></h1> </div> - <div style="padding-top: 30%; align-content: center;"> + <div style="padding-top: 10%; align-content: center;"> <h1 style="text-align: center; color: #e25555;" id="error-text"> </h1> </div> </div> </div> - <div class="container footer"> - <footer class="twelve columns"> - Made with <span style="color: #e25555;">♥</span> by <a - href="https://github.com/frg-fossee">frg-fossee</a> - </footer> - </div> <!-- end footer div.container --> - </div> - <!-- End Document - –––––––––––––––––––––––––––––––––––––––––––––––––– --> + <!-- End Document --> </body> </html> diff --git a/blocks/blocks/settings.py b/blocks/blocks/settings.py index 20f1e671..cbcf4fde 100644 --- a/blocks/blocks/settings.py +++ b/blocks/blocks/settings.py @@ -142,6 +142,8 @@ GOOGLE_OAUTH_REDIRECT_URI = os.environ.get('GOOGLE_OAUTH_REDIRECT_URI', 'http://localhost/api/auth/google-callback') POST_ACTIVATE_REDIRECT_URL = os.environ.get('POST_ACTIVATE_REDIRECT_URL', 'http://localhost/') +DOMAIN = os.environ.get('EMAIL_DOMAIN', 'localhost') +SITE_NAME = os.environ.get('EMAIL_SITE_NAME', 'Xcos') DJOSER = { 'LOGIN_FIELD': 'email', @@ -150,12 +152,16 @@ DJOSER = { 'PASSWORD_CHANGED_EMAIL_CONFIRMATION': True, 'SEND_CONFIRMATION_EMAIL': True, 'SET_PASSWORD_RETYPE': True, - 'PASSWORD_RESET_CONFIRM_URL': 'password/reset/confirm/{uid}/{token}', - 'ACTIVATION_URL': 'api/auth/users/activate/{uid}/{token}', + 'PASSWORD_RESET_CONFIRM_URL': 'api/auth/password/reset/confirm/{uid}/{token}', + 'ACTIVATION_URL': 'api/auth/users/activate/{uid}/{token}/', 'SEND_ACTIVATION_EMAIL': True, 'SOCIAL_AUTH_TOKEN_STRATEGY': 'authAPI.token.TokenStrategy', 'SOCIAL_AUTH_ALLOWED_REDIRECT_URIS': [GOOGLE_OAUTH_REDIRECT_URI], 'SERIALIZERS': { + 'user_create': 'authAPI.serializers.UserCreateSerializer', + 'user': 'authAPI.serializers.UserCreateSerializer', + 'current_user': 'authAPI.serializers.UserCreateSerializer', + 'user_delete': 'djoser.serializers.UserDeleteSerializer', 'token_create': 'authAPI.serializers.TokenCreateSerializer', }, } diff --git a/blocks/eda-frontend/src/pages/signUp.js b/blocks/eda-frontend/src/pages/signUp.js index 0457b664..b60da8dc 100644 --- a/blocks/eda-frontend/src/pages/signUp.js +++ b/blocks/eda-frontend/src/pages/signUp.js @@ -59,13 +59,16 @@ export default function SignUp () { const history = useHistory() - const [username, setUsername] = useState('') - const [password, setPassword] = useState('') const [email, setEmail] = useState('') + const [password, setPassword] = useState('') + const [reenterPassword, setReenterPassword] = useState('') const [accept, setAccept] = useState(true) const [showPassword, setShowPassword] = useState(false) const handleClickShowPassword = () => setShowPassword(!showPassword) const handleMouseDownPassword = () => setShowPassword(!showPassword) + const [showReenterPassword, setShowReenterPassword] = useState(false) + const handleClickShowReenterPassword = () => setShowReenterPassword(!showReenterPassword) + const handleMouseDownReenterPassword = () => setShowReenterPassword(!showReenterPassword) // Function call for google oAuth sign up. const handleGoogleSignup = () => { @@ -95,21 +98,8 @@ export default function SignUp () { margin='normal' required fullWidth - id='username' - label='Username' - name='username' - autoComplete='email' - value={username} - onChange={e => setUsername(e.target.value)} - autoFocus - /> - <TextField - variant='outlined' - margin='normal' - required - fullWidth id='email' - label='email' + label='Email' name='email' type='email' autoComplete='email' @@ -144,6 +134,33 @@ export default function SignUp () { onChange={e => setPassword(e.target.value)} autoComplete='current-password' /> + <TextField + variant='outlined' + margin='normal' + required + fullWidth + name='reenterPassword' + label='Reenter Password' + InputProps={{ + endAdornment: ( + <InputAdornment position='end'> + <IconButton + size='small' + aria-label='toggle password visibility' + onClick={handleClickShowReenterPassword} + onMouseDown={handleMouseDownReenterPassword} + > + {showReenterPassword ? <Visibility fontSize='small' /> : <VisibilityOff fontSize='small' />} {/* Handle password visibility */} + </IconButton> + </InputAdornment> + ) + }} + type={showReenterPassword ? 'text' : 'password'} + id='reenterPassword' + value={reenterPassword} + onChange={e => setReenterPassword(e.target.value)} + autoComplete='current-password' + /> <FormControlLabel control={<Checkbox checked={accept} onChange={e => setAccept(e.target.checked)} color='primary' />} label='I accept the Terms of Use & Privacy Policy' @@ -152,7 +169,7 @@ export default function SignUp () { fullWidth variant='contained' color='primary' - onClick={() => dispatch(signUp(email, username, password, history))} + onClick={() => dispatch(signUp(email, password, reenterPassword, history))} className={classes.submit} disabled={!accept} > diff --git a/blocks/eda-frontend/src/redux/actions/actions.js b/blocks/eda-frontend/src/redux/actions/actions.js index 5913d9e7..2dea52ec 100644 --- a/blocks/eda-frontend/src/redux/actions/actions.js +++ b/blocks/eda-frontend/src/redux/actions/actions.js @@ -23,7 +23,7 @@ export const SET_RESULT_GRAPH = 'SET_RESULT_GRAPH' export const SET_RESULT_TEXT = 'SET_RESULT_TEXT' export const SET_RESULT_TASK_ID = 'SET_RESULT_TASK_ID' -// Actions for handling user authentication and registeration +// Actions for handling user authentication and registration export const USER_LOADING = 'USER_LOADING' export const USER_LOADED = 'USER_LOADED' export const LOGIN_SUCCESSFUL = 'LOGIN_SUCCESSFUL' diff --git a/blocks/eda-frontend/src/redux/actions/authActions.js b/blocks/eda-frontend/src/redux/actions/authActions.js index 43f82715..84819eb4 100644 --- a/blocks/eda-frontend/src/redux/actions/authActions.js +++ b/blocks/eda-frontend/src/redux/actions/authActions.js @@ -111,11 +111,12 @@ export const login = (username, password, toUrl) => { } // Handle api call for user sign up -export const signUp = (email, username, password, history) => (dispatch) => { +export const signUp = (email, password, reenterPassword, history) => (dispatch) => { const body = { email, - username, - password + username: email, + password, + re_password: reenterPassword } // add headers @@ -140,13 +141,20 @@ export const signUp = (email, username, password, history) => (dispatch) => { .catch((err) => { const res = err.response if (res.status === 400 || res.status === 403 || res.status === 401) { - if (res.data.username !== undefined) { - if (res.data.username[0].search('already') !== -1 && res.data.username[0].search('exists') !== -1) { dispatch(signUpError('Username Already Taken.')) } + const data = res.data + if (data.email !== undefined) { + dispatch(signUpError(data.email[0])) + } else if (data.password !== undefined) { + dispatch(signUpError(data.password[0])) + } else if (data.re_password !== undefined) { + dispatch(signUpError(data.re_password[0])) + } else if (data.non_field_errors !== undefined) { + dispatch(signUpError(data.non_field_errors[0])) } else { - dispatch(signUpError('Enter Valid Credentials.')) + dispatch(signUpError('Enter valid credentials.')) } } else { - dispatch(signUpError('Something went wrong! Registeration Failed')) + dispatch(signUpError('Something went wrong! Registration Failed')) } }) } diff --git a/blocks/init.sh b/blocks/init.sh new file mode 100755 index 00000000..1557ef11 --- /dev/null +++ b/blocks/init.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +### SETTINGS: Modify as required ### +EMAIL='sunilshetye@rocketmail.com' +PASSWORD='' +### END OF SETTINGS ### + +rm -f xcosblocks.sqlite3 + +./manage.py makemigrations -v0 +./manage.py migrate -v0 +./manage.py loaddata xcosblocks + +echo "from authAPI.models import User; User.objects.create_superuser('$EMAIL', '$EMAIL', '$PASSWORD')" | + ./manage.py shell |