#!/usr/bin/env python """ Populate the pagure db with some dev data. """ import sys import os import pagure import tests from sqlalchemy import create_engine, MetaData import argparse ''' Usage: python dev-data.py --init python dev-data.py --clean python dev-data.py --populate python dev-data.py --all ''' def init_database(): DB_URL = pagure.APP.config['DB_URL'] # create the table if it doesnt exist pagure.lib.model.create_tables( DB_URL, pagure.APP.config.get('PATH_ALEMBIC_INI', None), acls=pagure.APP.config.get('ACLS', {}), debug=True) engine = create_engine('%s' % DB_URL, echo=True) metadata = MetaData(engine) metadata.reflect(bind=engine) return engine, metadata def empty_dev_db(metadata, engine): print('') print('') print('WARNING: Deleting all data from ', pagure.APP.config['DB_URL']) # Dangerous: this will wipe the data from the table but keep the schema print('') response = raw_input('Do you want to continue yes or no? ') if 'yes'.startswith(response.lower()): for tbl in reversed(metadata.sorted_tables): if tbl.fullname != 'acls': engine.execute(tbl.delete()) def insert_data(session, username, user_email): pagure.APP.config['EMAIL_SEND'] = False pagure.APP.config['TESTING'] = True ###################################### # tags item = pagure.lib.model.Tag( tag='tag1', ) session.add(item) session.commit() ###################################### # Users # Create a couple of users item = pagure.lib.model.User( user='pingou', fullname='PY C', password='foo', default_email='bar@pingou.com', ) session.add(item) session.commit() item = pagure.lib.model.User( user='foo', fullname='foo bar', password='foo', default_email='foo@bar.com', ) session.add(item) session.commit() item = pagure.lib.model.User( user=username, fullname=username, password='foo', default_email=user_email, ) session.add(item) session.commit() ###################################### # pagure_group item = pagure.lib.model.PagureGroup( group_name='admin', user_id=1, display_name='admin', description='Admin Group', ) session.add(item) session.commit() # Add a couple of groups so that we can list them item = pagure.lib.model.PagureGroup( group_name='group', group_type='user', user_id=1, # pingou display_name='group group', description='this is a group group', ) session.add(item) session.commit() item = pagure.lib.model.PagureGroup( group_name='rel-eng', group_type='user', user_id=1, # pingou display_name='Release Engineering', description='The group of release engineers', ) session.add(item) session.commit() ###################################### # projects import shutil # delete folder from local instance to start from a clean slate if os.path.exists(pagure.APP.config['GIT_FOLDER']): shutil.rmtree(pagure.APP.config['GIT_FOLDER']) tests.create_projects(session) tests.create_projects_git(pagure.APP.config['GIT_FOLDER'], bare=True) tests.add_content_git_repo( os.path.join(pagure.APP.config['GIT_FOLDER'], 'test.git')) tests.add_readme_git_repo( os.path.join(pagure.APP.config['GIT_FOLDER'], 'test.git')) # Add some content to the git repo tests.add_content_git_repo( os.path.join(pagure.APP.config['GIT_FOLDER'], 'forks', 'pingou', 'test.git')) tests.add_readme_git_repo( os.path.join(pagure.APP.config['GIT_FOLDER'], 'forks', 'pingou', 'test.git')) tests.add_commit_git_repo( os.path.join(pagure.APP.config['GIT_FOLDER'], 'forks', 'pingou', 'test.git'), ncommits=10) ###################################### # user_emails item = pagure.lib.model.UserEmail( user_id=1, email='bar@pingou.com') session.add(item) item = pagure.lib.model.UserEmail( user_id=1, email='foo@pingou.com') session.add(item) item = pagure.lib.model.UserEmail( user_id=2, email='foo@bar.com') session.add(item) item = pagure.lib.model.UserEmail( user_id=3, email=user_email) session.add(item) session.commit() ###################################### # user_emails_pending user = pagure.lib.search_user(session, username='pingou') email_pend = pagure.lib.model.UserEmailPending( user_id=user.id, email='foo@fp.o', token='abcdef', ) session.add(email_pend) session.commit() ###################################### # issues # Add an issue and tag it so that we can list them item = pagure.lib.model.Issue( id=1, uid='foobar', project_id=1, title='Problem with jenkins build', content='For some reason the tests fail at line:24', user_id=1, # pingou ) session.add(item) session.commit() item = pagure.lib.model.Issue( id=2, uid='foobar2', project_id=1, title='Unit tests failing', content='Need to fix code for the unit tests to ' 'pass so jenkins build can complete.', user_id=1, # pingou ) session.add(item) session.commit() user = pagure.lib.search_user(session, username=username) item = pagure.lib.model.Issue( id=3, uid='foobar3', project_id=1, title='Segfault during execution', content='Index out of bounds for variable i?', user_id=user.id, # current user ) session.add(item) session.commit() ###################################### # pagure_user_group group = pagure.lib.search_groups(session, pattern=None, group_name="rel-eng", group_type=None) user = pagure.lib.search_user(session, username='pingou') item = pagure.lib.model.PagureUserGroup( user_id=user.id, group_id=group.id ) session.add(item) session.commit() user = pagure.lib.search_user(session, username=username) group = pagure.lib.search_groups(session, pattern=None, group_name="admin", group_type=None) item = pagure.lib.model.PagureUserGroup( user_id=user.id, group_id=group.id ) session.add(item) session.commit() user = pagure.lib.search_user(session, username='foo') group = pagure.lib.search_groups(session, pattern=None, group_name="group", group_type=None) item = pagure.lib.model.PagureUserGroup( user_id=user.id, group_id=group.id ) session.add(item) session.commit() ###################################### # projects_groups group = pagure.lib.search_groups(session, pattern=None, group_name="rel-eng", group_type=None) repo = pagure.get_authorized_project(session, 'test') item = pagure.lib.model.ProjectGroup( project_id=repo.id, group_id=group.id ) session.add(item) session.commit() group = pagure.lib.search_groups(session, pattern=None, group_name="admin", group_type=None) repo = pagure.get_authorized_project(session, 'test2') item = pagure.lib.model.ProjectGroup( project_id=repo.id, group_id=group.id ) session.add(item) session.commit() ###################################### # pull_requests repo = pagure.get_authorized_project(session, 'test') forked_repo = pagure.get_authorized_project(session, 'test') req = pagure.lib.new_pull_request( session=session, repo_from=forked_repo, branch_from='master', repo_to=repo, branch_to='master', title='Fixing code for unittest', user=username, requestfolder=None, ) session.commit() ###################################### # tokens tests.create_tokens(session) ###################################### # user_projects user = pagure.lib.search_user(session, username='foo') repo = pagure.get_authorized_project(session, 'test') item = pagure.lib.model.ProjectUser( project_id=repo.id, user_id=user.id ) session.add(item) session.commit() user = pagure.lib.search_user(session, username=username) repo = pagure.get_authorized_project(session, 'test2') item = pagure.lib.model.ProjectUser( project_id=repo.id, user_id=user.id ) session.add(item) session.commit() ###################################### # issue_comments item = pagure.lib.model.IssueComment( user_id=1, issue_uid='foobar', comment='We may need to adjust the unittests instead of the code.', ) session.add(item) session.commit() ###################################### # issue_to_issue repo = pagure.get_authorized_project(session, 'test') all_issues = pagure.lib.search_issues(session, repo) pagure.lib.add_issue_dependency(session, all_issues[0], all_issues[1], 'pingou', pagure.APP.config['GIT_FOLDER']) ###################################### # pull_request_comments user = pagure.lib.search_user(session, username='pingou') # only 1 pull request available atm pr = pagure.lib.get_pull_request_of_user(session, "pingou")[0] item = pagure.lib.model.PullRequestComment( pull_request_uid=pr.uid, user_id=user.id, comment="+1 for me. Btw, could you rebase before you merge?", notification=0 ) session.add(item) session.commit() ###################################### # pull_request_flags user = pagure.lib.search_user(session, username='pingou') # only 1 pull request available atm pr = pagure.lib.get_pull_request_of_user(session, "pingou")[0] item = pagure.lib.model.PullRequestFlag( uid="random_pr_flag_uid", pull_request_uid=pr.uid, user_id=user.id, username=user.user, percent=80, comment="Jenkins build passes", url=str(pr.id) ) session.add(item) session.commit() ###################################### # tags_issues repo = pagure.get_authorized_project(session, 'test') issues = pagure.lib.search_issues(session, repo) item = pagure.lib.model.TagIssue( issue_uid=issues[0].uid, tag='Blocker', ) session.add(item) session.commit() ###################################### # tokens_acls tests.create_tokens_acl(session) ###################################### # Fork a project # delete fork data fork_proj_location = "forks/foo/test.git" try: shutil.rmtree(os.path.join(pagure.APP.config['GIT_FOLDER'], fork_proj_location)) except: print('git folder already deleted') try: shutil.rmtree(os.path.join(pagure.APP.config['DOCS_FOLDER'], fork_proj_location)) except: print('docs folder already deleted') try: shutil.rmtree(os.path.join(pagure.APP.config['TICKETS_FOLDER'], fork_proj_location)) except: print('tickets folder already deleted') try: shutil.rmtree(os.path.join(pagure.APP.config['REQUESTS_FOLDER'], fork_proj_location)) except: print('requests folder already deleted') repo = pagure.get_authorized_project(session, 'test') result = pagure.lib.fork_project(session, 'foo', repo, pagure.APP.config['GIT_FOLDER'], pagure.APP.config['DOCS_FOLDER'], pagure.APP.config['TICKETS_FOLDER'], pagure.APP.config['REQUESTS_FOLDER']) if result == 'Repo "test" cloned to "foo/test"': session.commit() if __name__ == "__main__": desc = "Run the dev database initialization/insertion/deletion " \ "script for db located " + str(pagure.APP.config['DB_URL']) parser = argparse.ArgumentParser(prog="dev-data", description=desc) parser.add_argument('-i', '--init', action="store_true", help="Create the dev db") parser.add_argument('-p', '--populate', action="store_true", help="Add test data to the db") parser.add_argument('-d', '--delete', action="store_true", help="Wipe the dev db") parser.add_argument('-a', '--all', action="store_true", help="Create, Wipe, Populate the dev db") args = parser.parse_args() # forcing the user to choose if not any(vars(args).values()): parser.error('No arguments provided.') if args.init or args.delete or args.all: eng, meta = init_database() if args.delete or args.all: empty_dev_db(meta, eng) if args.populate or args.all: session = pagure.SESSION invalid_option = ['pingou', 'bar@pingou.com', 'foo', 'foo@bar.com'] print("") user_name = raw_input( "Enter your username so we can add you into the test data: ") while user_name in invalid_option: print("Reserved names: " + str(invalid_option)) user_name = raw_input( "Enter your username so we can add you into the test data: ") if not user_name.replace(" ", ""): user_name = 'pythagoras' print("") user_email = raw_input("Enter your user email: ") while user_email in invalid_option: print("Reserved names: " + str(invalid_option)) user_email = raw_input("Enter your user email: ") if not user_email.replace(" ", ""): user_email = 'pythagoras@math.com' insert_data(session, user_name, user_email)