Verified Commit efe9a5e3 authored by Peter Stanko's avatar Peter Stanko
Browse files

Import users using csv

parent c9babed9
...@@ -105,6 +105,17 @@ def cli_users_list(): ...@@ -105,6 +105,17 @@ def cli_users_list():
manager.list_users() manager.list_users()
@users_cli.command('import-csv', help='Import users from the csv')
@click.argument('course')
@click.argument('role')
@click.argument('group', required=False)
@click.option('-f', '--file', help="From which file they should be imported, default is stdin",
required=False)
def cli_users_list(course, role, group, file):
log.info(f'[CMD] Importing users from the csv users')
manager.import_users(file, course=course, role=role, group=group)
# #
# Courses related commands # Courses related commands
# #
......
import csv
import datetime import datetime
import sys
from flask import Flask from flask import Flask
from flask_sqlalchemy import SQLAlchemy from flask_sqlalchemy import SQLAlchemy
...@@ -8,7 +10,7 @@ from management.data.data_dev import init_dev_data ...@@ -8,7 +10,7 @@ from management.data.data_dev import init_dev_data
from management.data.data_prod import init_prod_data from management.data.data_prod import init_prod_data
from management.data.data_test import init_test_data from management.data.data_test import init_test_data
from portal import logger from portal import logger
from portal.database.models import Course, Role, Secret, Submission, SubmissionState, User from portal.database.models import Course, Group, Role, Secret, Submission, SubmissionState, User
from portal.service.rest import RestService from portal.service.rest import RestService
from portal.tools import time from portal.tools import time
...@@ -183,4 +185,31 @@ class DataManagement(object): ...@@ -183,4 +185,31 @@ class DataManagement(object):
user = self.rest.find.user(name) user = self.rest.find.user(name)
user.secrets.append(Secret(name='user-cli-secret', value=secret)) user.secrets.append(Secret(name='user-cli-secret', value=secret))
log.debug(f'[DATA] Created secret for user: {user.log_name}') log.debug(f'[DATA] Created secret for user: {user.log_name}')
self.db.session.commit() self.db.session.commit()
\ No newline at end of file
def import_users(self, file, course=None, role=None, group=None):
with self.app.app_context():
if role:
role = self.rest.find.role(course, role)
if group:
group = self.rest.find.group(course, group)
users = self._parse_csv_users(file)
created_users = []
for user in users:
created = self.rest.users.create(**user, admin=False)
created_users.append(created)
self._add_users_to_course(created_users, role, group)
def _parse_csv_users(self, file=None):
fields = ['username', 'uco', 'email', 'name']
if file is None:
return csv.DictReader(sys.stdin, fieldnames=fields)
with open(file) as f:
return csv.DictReader(f, fieldnames=fields)
def _add_users_to_course(self, created_users, role: Role, group: Group):
for user in created_users:
if role:
self.rest.roles(role).add_client(user)
if group:
self.rest.groups(group).add_user(user)
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment