Loading app.py +3 −2 Original line number Diff line number Diff line Loading @@ -104,9 +104,10 @@ USERS @click.option('-p', '--password', help='Users password', prompt=True, hide_input=True, confirmation_prompt=True) @click.option('-s', '--secret', help="User's secret") def cli_users_create(name, password, secret): @click.option('-G', '--gitlab', help="Gitlab username") def cli_users_create(name, password, secret, gitlab): log.info(f"[CMD] Create User: {name}") manager.create_admin_user(name, password, secret) manager.create_admin_user(name, password, secret, gitlab) @users_cli.command('set-password', help='Sets password for the user') Loading docker_run.sh +2 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ ENVIRONMENT="${ENVIRONMENT:-dev}" ADMIN_USER="${ADMIN_USER:-admin}" ADMIN_PASSWORD="${ADMIN_PASSWORD:-789789}" ADMIN_SECRET="${ADMIN_SECRET:-devel-admin-secret}" ADMIN_GITLAB="${ADMIN_GITLAB}" # INIT echo "[INIT] Initializing the database" Loading @@ -24,7 +25,7 @@ flask db upgrade echo "[INIT] Initializing data for env: $ENVIRONMENT" flask data init ${ENVIRONMENT} echo "[INIT] Initializing admin user: ${ADMIN_USER}" flask users create ${ADMIN_USER} --password ${ADMIN_PASSWORD} --secret ${ADMIN_SECRET} flask users create ${ADMIN_USER} --password ${ADMIN_PASSWORD} --secret ${ADMIN_SECRET} --gitlab ${ADMIN_GITLAB} if [ "$DATASETS" != "" ]; then echo "[INIT] Additional datasets: $DATASETS" Loading management/data/__init__.py +4 −2 Original line number Diff line number Diff line Loading @@ -13,8 +13,8 @@ from management.data.data_dev import init_dev_data from management.data.data_prod import init_prod_data from management.data.data_test import init_test_data from portal import logger from portal.database.models import Course, Role, Secret, Submission, User from portal.database import SubmissionState from portal.database.models import Course, Role, Secret, Submission, User from portal.service.find import FindService from portal.service.users import UserService from portal.tools import time Loading Loading @@ -94,7 +94,8 @@ class DataManagement: log.debug(f"[DATA] User's password updated: {user.log_name}") return user def create_admin_user(self, name: str, password: str, secret: str = None) -> User: def create_admin_user(self, name: str, password: str, secret: str = None, gitlab: str = None) \ -> User: """Creates new admin user with username Args: name(str): Username of the user Loading @@ -107,6 +108,7 @@ class DataManagement: username=name, name=name, admin=True, gitlab_username=gitlab, password=password) if secret: user.secrets.append(Secret(name='admin-secret', value=secret)) Loading management/data/shared.py +3 −2 Original line number Diff line number Diff line Loading @@ -101,11 +101,12 @@ class DataFactory: return self._db.session def create_user(self, username: str, uco=0, name=None, password=None, email=None, admin=False) -> User: email=None, admin=False, gitlab_username: str = None) -> User: email = email or f"{username}@example.com" password = password or "123456" user = self.__create_entity( User, uco=uco, username=username, is_admin=admin, email=email) User, uco=uco, username=username, is_admin=admin, email=email, gitlab_username=gitlab_username) user.name = name or f"{username.capitalize()} User" user.set_password(password=password) return user Loading portal/database/models.py +17 −8 Original line number Diff line number Diff line Loading @@ -118,10 +118,9 @@ class Secret(db.Model, EntityBase): value = db.Column(db.String(120)) expires_at = db.Column(db.TIMESTAMP, nullable=True) client_id = db.Column(db.String(36), db.ForeignKey( 'client.id', ondelete='cascade'), nullable=False) client = db.relationship( "Client", back_populates="secrets", uselist=False) client_id = db.Column(db.String(36), db.ForeignKey('client.id', ondelete='cascade'), nullable=False) client = db.relationship("Client", back_populates="secrets", uselist=False) def __init__(self, name: str, value: str = None, expires_at=None): # TODO: check date/timestamp Loading Loading @@ -164,6 +163,7 @@ class User(Client, EntityBase): """ UPDATABLE = ['name', 'email', 'uco', 'gitlab_username', 'managed'] BASE_PARAMS = ['username', 'codename', 'is_admin', *UPDATABLE, 'managed', 'id'] LISTABLE = ['username', 'gitlab_username'] __tablename__ = 'user' id = db.Column(db.String(length=36), db.ForeignKey('client.id'), default=lambda: str(uuid.uuid4()), primary_key=True) Loading @@ -174,7 +174,7 @@ class User(Client, EntityBase): # optional - after password change password_hash = db.Column(db.String(120), default=None) gitlab_username = db.Column(db.String(50), nullable=True) _gitlab_username = db.Column('gitlab_username', db.String(50), nullable=True) managed = db.Column(db.Boolean, default=False) submissions = db.relationship("Submission", back_populates="user", cascade="all, delete-orphan", passive_deletes=True) Loading @@ -185,11 +185,19 @@ class User(Client, EntityBase): } @hybrid_property def username(self): def username(self) -> str: return self.codename @hybrid_property def gitlab_username(self) -> str: return self._gitlab_username or self.username @gitlab_username.setter def gitlab_username(self, value: str): self._gitlab_username = value @username.setter def username(self, value): def username(self, value: str): self.codename = value def is_self(self, eid): Loading Loading @@ -276,7 +284,7 @@ class User(Client, EntityBase): return self.query_projects_by_course(course=course).all() def __init__(self, uco: int = None, email: str = None, username: str = None, is_admin: bool = False, **kwargs) -> None: is_admin: bool = False, gitlab_username: str = None, **kwargs) -> None: """Creates user instance Args: uco(int): User's UCO (school identifier) Loading @@ -288,6 +296,7 @@ class User(Client, EntityBase): self.email = email self.username = username self.is_admin = is_admin self.gitlab_username = gitlab_username super().__init__(ClientType.USER, **kwargs) def __eq__(self, other): Loading Loading
app.py +3 −2 Original line number Diff line number Diff line Loading @@ -104,9 +104,10 @@ USERS @click.option('-p', '--password', help='Users password', prompt=True, hide_input=True, confirmation_prompt=True) @click.option('-s', '--secret', help="User's secret") def cli_users_create(name, password, secret): @click.option('-G', '--gitlab', help="Gitlab username") def cli_users_create(name, password, secret, gitlab): log.info(f"[CMD] Create User: {name}") manager.create_admin_user(name, password, secret) manager.create_admin_user(name, password, secret, gitlab) @users_cli.command('set-password', help='Sets password for the user') Loading
docker_run.sh +2 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ ENVIRONMENT="${ENVIRONMENT:-dev}" ADMIN_USER="${ADMIN_USER:-admin}" ADMIN_PASSWORD="${ADMIN_PASSWORD:-789789}" ADMIN_SECRET="${ADMIN_SECRET:-devel-admin-secret}" ADMIN_GITLAB="${ADMIN_GITLAB}" # INIT echo "[INIT] Initializing the database" Loading @@ -24,7 +25,7 @@ flask db upgrade echo "[INIT] Initializing data for env: $ENVIRONMENT" flask data init ${ENVIRONMENT} echo "[INIT] Initializing admin user: ${ADMIN_USER}" flask users create ${ADMIN_USER} --password ${ADMIN_PASSWORD} --secret ${ADMIN_SECRET} flask users create ${ADMIN_USER} --password ${ADMIN_PASSWORD} --secret ${ADMIN_SECRET} --gitlab ${ADMIN_GITLAB} if [ "$DATASETS" != "" ]; then echo "[INIT] Additional datasets: $DATASETS" Loading
management/data/__init__.py +4 −2 Original line number Diff line number Diff line Loading @@ -13,8 +13,8 @@ from management.data.data_dev import init_dev_data from management.data.data_prod import init_prod_data from management.data.data_test import init_test_data from portal import logger from portal.database.models import Course, Role, Secret, Submission, User from portal.database import SubmissionState from portal.database.models import Course, Role, Secret, Submission, User from portal.service.find import FindService from portal.service.users import UserService from portal.tools import time Loading Loading @@ -94,7 +94,8 @@ class DataManagement: log.debug(f"[DATA] User's password updated: {user.log_name}") return user def create_admin_user(self, name: str, password: str, secret: str = None) -> User: def create_admin_user(self, name: str, password: str, secret: str = None, gitlab: str = None) \ -> User: """Creates new admin user with username Args: name(str): Username of the user Loading @@ -107,6 +108,7 @@ class DataManagement: username=name, name=name, admin=True, gitlab_username=gitlab, password=password) if secret: user.secrets.append(Secret(name='admin-secret', value=secret)) Loading
management/data/shared.py +3 −2 Original line number Diff line number Diff line Loading @@ -101,11 +101,12 @@ class DataFactory: return self._db.session def create_user(self, username: str, uco=0, name=None, password=None, email=None, admin=False) -> User: email=None, admin=False, gitlab_username: str = None) -> User: email = email or f"{username}@example.com" password = password or "123456" user = self.__create_entity( User, uco=uco, username=username, is_admin=admin, email=email) User, uco=uco, username=username, is_admin=admin, email=email, gitlab_username=gitlab_username) user.name = name or f"{username.capitalize()} User" user.set_password(password=password) return user Loading
portal/database/models.py +17 −8 Original line number Diff line number Diff line Loading @@ -118,10 +118,9 @@ class Secret(db.Model, EntityBase): value = db.Column(db.String(120)) expires_at = db.Column(db.TIMESTAMP, nullable=True) client_id = db.Column(db.String(36), db.ForeignKey( 'client.id', ondelete='cascade'), nullable=False) client = db.relationship( "Client", back_populates="secrets", uselist=False) client_id = db.Column(db.String(36), db.ForeignKey('client.id', ondelete='cascade'), nullable=False) client = db.relationship("Client", back_populates="secrets", uselist=False) def __init__(self, name: str, value: str = None, expires_at=None): # TODO: check date/timestamp Loading Loading @@ -164,6 +163,7 @@ class User(Client, EntityBase): """ UPDATABLE = ['name', 'email', 'uco', 'gitlab_username', 'managed'] BASE_PARAMS = ['username', 'codename', 'is_admin', *UPDATABLE, 'managed', 'id'] LISTABLE = ['username', 'gitlab_username'] __tablename__ = 'user' id = db.Column(db.String(length=36), db.ForeignKey('client.id'), default=lambda: str(uuid.uuid4()), primary_key=True) Loading @@ -174,7 +174,7 @@ class User(Client, EntityBase): # optional - after password change password_hash = db.Column(db.String(120), default=None) gitlab_username = db.Column(db.String(50), nullable=True) _gitlab_username = db.Column('gitlab_username', db.String(50), nullable=True) managed = db.Column(db.Boolean, default=False) submissions = db.relationship("Submission", back_populates="user", cascade="all, delete-orphan", passive_deletes=True) Loading @@ -185,11 +185,19 @@ class User(Client, EntityBase): } @hybrid_property def username(self): def username(self) -> str: return self.codename @hybrid_property def gitlab_username(self) -> str: return self._gitlab_username or self.username @gitlab_username.setter def gitlab_username(self, value: str): self._gitlab_username = value @username.setter def username(self, value): def username(self, value: str): self.codename = value def is_self(self, eid): Loading Loading @@ -276,7 +284,7 @@ class User(Client, EntityBase): return self.query_projects_by_course(course=course).all() def __init__(self, uco: int = None, email: str = None, username: str = None, is_admin: bool = False, **kwargs) -> None: is_admin: bool = False, gitlab_username: str = None, **kwargs) -> None: """Creates user instance Args: uco(int): User's UCO (school identifier) Loading @@ -288,6 +296,7 @@ class User(Client, EntityBase): self.email = email self.username = username self.is_admin = is_admin self.gitlab_username = gitlab_username super().__init__(ClientType.USER, **kwargs) def __eq__(self, other): Loading