diff --git a/ereuse_devicehub/migrations/versions/abba37ff5c80_user_validation.py b/ereuse_devicehub/migrations/versions/abba37ff5c80_user_validation.py deleted file mode 100644 index 3b738257..00000000 --- a/ereuse_devicehub/migrations/versions/abba37ff5c80_user_validation.py +++ /dev/null @@ -1,60 +0,0 @@ -"""user validation - -Revision ID: abba37ff5c80 -Revises: d65745749e34 -Create Date: 2022-09-30 10:01:19.761864 - -""" -import sqlalchemy as sa -from alembic import context, op -from sqlalchemy.dialects import postgresql - -# revision identifiers, used by Alembic. -revision = 'abba37ff5c80' -down_revision = 'd65745749e34' -branch_labels = None -depends_on = None - - -def get_inv(): - INV = context.get_x_argument(as_dictionary=True).get('inventory') - if not INV: - raise ValueError("Inventory value is not specified") - return INV - - -def upgrade(): - op.create_table( - 'user_validation', - sa.Column('id', sa.BigInteger(), nullable=False), - sa.Column( - 'updated', - sa.TIMESTAMP(timezone=True), - server_default=sa.text('CURRENT_TIMESTAMP'), - nullable=False, - ), - sa.Column( - 'created', - sa.TIMESTAMP(timezone=True), - server_default=sa.text('CURRENT_TIMESTAMP'), - nullable=False, - ), - sa.Column('joined_at', sa.TIMESTAMP(timezone=True), nullable=True), - sa.Column('expired', sa.BigInteger(), nullable=False), - sa.Column('token', postgresql.UUID(as_uuid=True), nullable=False), - sa.Column('user_id', postgresql.UUID(as_uuid=True), nullable=False), - sa.PrimaryKeyConstraint('id'), - sa.ForeignKeyConstraint( - ['user_id'], - ['common.user.id'], - ), - sa.UniqueConstraint('token'), - schema=f'{get_inv()}', - ) - - op.execute(f"CREATE SEQUENCE {get_inv()}.user_validation_seq;") - - -def downgrade(): - op.drop_table('user_validation', schema=f'{get_inv()}') - op.execute(f"DROP SEQUENCE {get_inv()}.user_validation_seq;") diff --git a/ereuse_devicehub/register/__init__.py b/ereuse_devicehub/register/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/ereuse_devicehub/register/forms.py b/ereuse_devicehub/register/forms.py deleted file mode 100644 index 28b47ee6..00000000 --- a/ereuse_devicehub/register/forms.py +++ /dev/null @@ -1,114 +0,0 @@ -from flask import current_app as app -from flask import render_template -from flask_wtf import FlaskForm -from wtforms import EmailField, PasswordField, StringField, validators - -from ereuse_devicehub.db import db -from ereuse_devicehub.mail.sender import send_email -from ereuse_devicehub.resources.agent.models import Person -from ereuse_devicehub.resources.user.models import User, UserValidation - - -class UserNewRegisterForm(FlaskForm): - email = EmailField( - 'Email Address', [validators.DataRequired(), validators.Length(min=6, max=35)] - ) - password = PasswordField( - 'Password', [validators.DataRequired(), validators.Length(min=6, max=35)] - ) - password2 = PasswordField( - 'Password', [validators.DataRequired(), validators.Length(min=6, max=35)] - ) - name = StringField( - 'Name', [validators.DataRequired(), validators.Length(min=3, max=35)] - ) - - error_messages = { - 'invalid_login': ( - "Please enter a correct email and password. Note that both " - "fields may be case-sensitive." - ), - 'inactive': "This account is inactive.", - } - - def validate(self, extra_validators=None): - is_valid = super().validate(extra_validators) - - if not is_valid: - return False - - email = self.email.data - password = self.password.data - password2 = self.password2.data - if password != password2: - self.form_errors.append('The passwords are not equal.') - return False - - txt = 'This email are in use.' - email = self.email.data - if User.query.filter_by(email=email).first(): - self.form_errors.append(txt) - return False - - self.email.data = self.email.data.strip() - self.password.data = self.password.data.strip() - - return True - - def save(self, commit=True): - user_validation = self.new_user() - if commit: - db.session.commit() - - self._token = user_validation.token - self.send_mail() - self.send_mail_admin(user_validation.user) - - def new_user(self): - user = User(email=self.email.data, password=self.password.data, active=False) - - person = Person( - email=self.email.data, - name=self.name.data, - ) - - user.individuals.add(person) - db.session.add(user) - - user_validation = UserValidation( - user=user, - ) - db.session.add(user_validation) - - return user_validation - - def send_mail(self): - host = app.config.get('HOST') - token = self._token - url = f'https://{ host }/validate_user/{ token }' - template = 'registration/email_validation.txt' - template_html = 'registration/email_validation.html' - context = { - 'name': self.name.data, - 'host': host, - 'url': url, - } - subject = "Please activate your Usody account" - message = render_template(template, **context) - message_html = render_template(template_html, **context) - - send_email(subject, [self.email.data], message, html_body=message_html) - - def send_mail_admin(self, user): - person = next(iter(user.individuals)) - context = { - 'email': person.email, - 'name': person.name, - } - template = 'registration/email_admin_new_user.txt' - message = render_template(template, **context) - subject = "New Register" - - email_admin = app.config.get("EMAIL_ADMIN") - if email_admin: - send_email(subject, [email_admin], message) diff --git a/ereuse_devicehub/register/templates/registration/email_admin_new_user.txt b/ereuse_devicehub/register/templates/registration/email_admin_new_user.txt deleted file mode 100644 index 4b6344a2..00000000 --- a/ereuse_devicehub/register/templates/registration/email_admin_new_user.txt +++ /dev/null @@ -1,4 +0,0 @@ -A new user has been registered: - -Name: {{ name }} -Email: {{ email }} diff --git a/ereuse_devicehub/register/templates/registration/email_validation.html b/ereuse_devicehub/register/templates/registration/email_validation.html deleted file mode 100644 index 3779df3b..00000000 --- a/ereuse_devicehub/register/templates/registration/email_validation.html +++ /dev/null @@ -1,9 +0,0 @@ -Welcome to Usody.com, {{ name }}!
-
-Please confirm your account by clicking on the following link:
-{{ url }}
-
- -
-Plaça Eusebi Güell 6-7, Edifici Vèrtex (UPC), planta 0, Barcelona 08034, Spain
-Associació Pangea – Coordinadora Comunicació per a la Cooperació - NIF: G-60437761 diff --git a/ereuse_devicehub/register/templates/registration/email_validation.txt b/ereuse_devicehub/register/templates/registration/email_validation.txt deleted file mode 100644 index 760a1878..00000000 --- a/ereuse_devicehub/register/templates/registration/email_validation.txt +++ /dev/null @@ -1,7 +0,0 @@ -Welcome to Usody.com, {{ name }}! - -Please confirm your account by clicking on the following link: {{ url }} - --- -Plaça Eusebi Güell 6-7, Edifici Vèrtex (UPC), planta 0, Barcelona 08034, Spain -Associació Pangea – Coordinadora Comunicació per a la Cooperació - NIF: G-60437761 diff --git a/ereuse_devicehub/register/templates/registration/user_registration.html b/ereuse_devicehub/register/templates/registration/user_registration.html deleted file mode 100644 index 74df13a4..00000000 --- a/ereuse_devicehub/register/templates/registration/user_registration.html +++ /dev/null @@ -1,172 +0,0 @@ -{% extends "ereuse_devicehub/base.html" %} - -{% block page_title %}Create your account{% endblock %} - -{% block body %} -
-
- -
-
-
-
- -
- - - -
- -
- -
- -
-
Create your account
- {% if not form._token %} - {% if form.form_errors %} -

- {% for error in form.form_errors %} - {{ error }}
- {% endfor %} -

- {% endif %} -
- -
- {{ form.csrf_token }} - -
- - {% if form.name.errors %} -

- {% for error in form.name.errors %} - {{ error }}
- {% endfor %} -

- {% endif %} -
- -
- -
Please enter your email.
- {% if form.email.errors %} -

- {% for error in form.email.errors %} - {{ error }}
- {% endfor %} -

- {% endif %} -
- -
-
- - -
-
Please enter a password!
- {% if form.password.errors %} -

- {% for error in form.password.errors %} - {{ error }}
- {% endfor %} -

- {% endif %} -
- -
-
- - -
-
Please enter a password again!
- {% if form.password2.errors %} -

- {% for error in form.password2.errors %} - {{ error }}
- {% endfor %} -

- {% endif %} -
- -
- Password must be at least 6 characters. -
- -
- - I accept the - terms and - privacy policy - -
- -
- -
-
-

- Already have an account? Sign in -

-
-
- {% else %} -
-
- We have sent you a validation email.
- Please check your email. -
- {% endif %} - -
-
- -
- Help | - Privacy | - Terms -
- -
-
-
- - - - -
-{% endblock body %} diff --git a/ereuse_devicehub/register/templates/registration/user_validation.html b/ereuse_devicehub/register/templates/registration/user_validation.html deleted file mode 100644 index c48ac592..00000000 --- a/ereuse_devicehub/register/templates/registration/user_validation.html +++ /dev/null @@ -1,68 +0,0 @@ -{% extends "ereuse_devicehub/base.html" %} - -{% block page_title %}Login{% endblock %} - -{% block body %} -
-
- -
-
-
-
- -
- - - -
- -
- -
- - {% if is_valid %} -
-
User is valid
- -
- You have successfully activated your account!
- Sign in. -
-
- {% else %} -
-
User is Invalid
-
-
- Invalid -
-
- -
-
- Sorry, your token not exist or is expired. -
-
-
- {% endif %} - -
-
- -
- Help | - Privacy | - Terms -
- -
-
-
- -
- -
-
- -{% endblock body %} diff --git a/ereuse_devicehub/register/views.py b/ereuse_devicehub/register/views.py deleted file mode 100644 index d506ecba..00000000 --- a/ereuse_devicehub/register/views.py +++ /dev/null @@ -1,50 +0,0 @@ -import flask -from flask import Blueprint -from flask.views import View - -from ereuse_devicehub import __version__ -from ereuse_devicehub.db import db -from ereuse_devicehub.register.forms import UserNewRegisterForm -from ereuse_devicehub.resources.user.models import UserValidation - -register = Blueprint('register', __name__, template_folder='templates') - - -class UserRegistrationView(View): - methods = ['GET', 'POST'] - template_name = 'registration/user_registration.html' - - def dispatch_request(self): - form = UserNewRegisterForm() - if form.validate_on_submit(): - form.save() - context = {'form': form, 'version': __version__} - return flask.render_template(self.template_name, **context) - - -class UserValidationView(View): - methods = ['GET'] - template_name = 'registration/user_validation.html' - - def dispatch_request(self, token): - context = {'is_valid': self.is_valid(token), 'version': __version__} - return flask.render_template(self.template_name, **context) - - def is_valid(self, token): - user_valid = UserValidation.query.filter_by(token=token).first() - if not user_valid: - return False - user = user_valid.user - user.active = True - db.session.commit() - return True - - -register.add_url_rule( - '/new_register/', - view_func=UserRegistrationView.as_view('user-registration'), -) -register.add_url_rule( - '/validate_user/', - view_func=UserValidationView.as_view('user-validation'), -) diff --git a/ereuse_devicehub/resources/user/models.py b/ereuse_devicehub/resources/user/models.py index a65554ee..5eadb21d 100644 --- a/ereuse_devicehub/resources/user/models.py +++ b/ereuse_devicehub/resources/user/models.py @@ -119,19 +119,3 @@ class Session(Thing): def __str__(self) -> str: return '{0.token}'.format(self) - - -class UserValidation(Thing): - id = Column(BigInteger, Sequence('user_validation_seq'), primary_key=True) - expired = Column(BigInteger, default=0) - joined_at = db.Column(db.DateTime()) - token = Column(UUID(as_uuid=True), default=uuid4, unique=True, nullable=False) - user_id = db.Column(db.UUID(as_uuid=True), db.ForeignKey(User.id)) - user = db.relationship( - User, - backref=db.backref('user_validation', lazy=True, collection_class=set), - collection_class=set, - ) - - def __str__(self) -> str: - return '{0.token}'.format(self) diff --git a/tests/conftest.py b/tests/conftest.py index 8a10cea8..8e5c52d1 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -22,7 +22,6 @@ from ereuse_devicehub.devicehub import Devicehub from ereuse_devicehub.inventory.views import devices from ereuse_devicehub.labels.views import labels from ereuse_devicehub.mail.flask_mail import Mail -from ereuse_devicehub.register.views import register from ereuse_devicehub.resources.agent.models import Person from ereuse_devicehub.resources.enums import SessionType from ereuse_devicehub.resources.tag import Tag @@ -66,7 +65,6 @@ def _app(config: TestConfig) -> Devicehub: app.register_blueprint(labels) app.register_blueprint(api) app.register_blueprint(workbench) - app.register_blueprint(register) app.config["SQLALCHEMY_RECORD_QUERIES"] = True app.config['PROFILE'] = True # app.wsgi_app = ProfilerMiddleware(app.wsgi_app, restrictions=[30]) diff --git a/tests/test_basic.py b/tests/test_basic.py index b75cc6e6..3d7a0ad8 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -106,8 +106,6 @@ def test_api_docs(client: Client): '/versions/', '/workbench/', '/workbench/erasure_host/{id}/', - '/new_register/', - '/validate_user/{token}', } assert docs['info'] == {'title': 'Devicehub', 'version': '0.2'} assert docs['components']['securitySchemes']['bearerAuth'] == { diff --git a/tests/test_render_2_0.py b/tests/test_render_2_0.py index fbc8307c..f9f82928 100644 --- a/tests/test_render_2_0.py +++ b/tests/test_render_2_0.py @@ -16,7 +16,7 @@ from ereuse_devicehub.parser.models import SnapshotsLog from ereuse_devicehub.resources.action.models import Snapshot from ereuse_devicehub.resources.device.models import Device, Placeholder from ereuse_devicehub.resources.lot.models import Lot -from ereuse_devicehub.resources.user.models import User, UserValidation +from ereuse_devicehub.resources.user.models import User from tests import conftest @@ -2604,34 +2604,6 @@ def test_snapshot_is_server_erase(user3: UserClientFlask): assert snapshot2 in snapshot.device.actions -@pytest.mark.mvp -@pytest.mark.usefixtures(conftest.app_context.__name__) -def test_new_register(user3: UserClientFlask, app: Devicehub): - uri = '/new_register/' - body, status = user3.get(uri) - assert "Create your account" in body - - data = { - 'csrf_token': generate_csrf(), - 'email': "foo@bar.cxm", - 'password': "123456", - 'password2': "123456", - 'name': "booBar", - } - body, status = user3.post(uri, data=data) - assert status == '200 OK' - assert "Please check your email." in body - - user_valid = UserValidation.query.one() - assert user_valid.user.active is False - - uri = '/validate_user/' + str(user_valid.token) - body, status = user3.get(uri) - assert status == '200 OK' - assert "You have successfully activated your account!" in body - assert user_valid.user.active - - @pytest.mark.mvp @pytest.mark.usefixtures(conftest.app_context.__name__) def test_system_uuid_motherboard(user3: UserClientFlask):