Example #1
0
def editjson(id: int):
    """Lets the user edit the raw json of the character."""
    c = get_character(id, check_author=True)
    form = ImportForm(obj=c)

    if form.validate_on_submit():
        assert form.body.data is not None
        c.title = form.title.data
        c.body = form.body.data

        if form.migration.data:
            logger.debug("Trying to migrate data")
            data = form.body.data
            c.body = migrate(data, latest, migrations=migrations)
        elif form.conversion.data:
            logger.debug("Conversion is checked")
            data = form.body.data
            c.body = convert_from_dholes(data)

        logentry = LogEntry(c, "JSON edited", user_id=current_user.id)
        session.add(logentry)

        session.commit()
        return redirect(url_for('character.view', id=c.id))

    form.submit.label.text = 'Save'

    validation_errors = c.validate()

    return render_template('character/import.html.jinja',
                           title="Edit JSON",
                           validation_errors=validation_errors,
                           form=form,
                           type=None)
Example #2
0
def update(id: int):
    character = get_character(id, check_author=True)

    if request.method == "POST":
        update = request.get_json()
        assert update is not None
        for setting in update:
            character.set_attribute(setting)
            field = setting['field']
            subfield = setting.get('subfield', '')
            value = setting['value']
            type = setting.get('type', 'value')
            if type == 'portrait' and value is not None:
                value = "[image]"

            log_subfield = ''
            if subfield is not None and subfield != 'None':
                log_subfield = ' ' + subfield
            log_message = (f"set {type} on {field}{log_subfield}: {value}")

            logentry = LogEntry(character,
                                log_message,
                                user_id=current_user.id)
            session.add(logentry)

        character.store_data()
        session.commit()

    return "OK"
Example #3
0
def create():
    form = CreateForm()
    if form.validate_on_submit():
        c = Campaign(title=form.title.data, user_id=current_user.profile.id)
        session.add(c)
        session.commit()
        return redirect(url_for('campaign.view', id=c.id))
    return render_template('campaign/create.html.jinja', form=form)
Example #4
0
def create_folder(folder_id=None):
    folderform = NewFolderForm(prefix="newfolderform")
    if folderform.validate_on_submit():
        logger.debug("Create a new folder")
        folder = AssetFolder(parent_id=folderform.parent_id.data,
                             title=folderform.title.data,
                             owner=current_user.profile)
        session.add(folder)
        session.commit()
    return redirect(url_for('userassets.index', folder_id=folder_id))
Example #5
0
def folders(folder_id=None):
    new_folder_form = NewFolderForm(prefix='new_folder')

    if new_folder_form.validate_on_submit():
        print("From validated, add folder")
        folder = Folder()
        new_folder_form.populate_obj(folder)
        session.add(folder)
        session.commit()
        return redirect('/content')
    else:
        print("Form did not validate")
        # return redirect(request.url)

    new_folder_form.owner_id.data = current_user.profile.id
    new_folder_form.parent_id.data = folder_id

    current_folder = Folder.query.get(folder_id)

    folders = None
    characters = None
    campaigns = None
    tree = []

    if current_folder is None:
        folders = current_user.profile.folders.filter(
            Folder.parent_id.__eq__(None))
        characters = current_user.profile.characters.filter(
            Character.folder_id.__eq__(None))
        campaigns = current_user.profile.campaigns.filter(
            campaignmodels.Campaign.folder_id.__eq__(None))

    else:
        folders = current_folder.subfolders
        characters = current_folder.characters
        campaigns = current_folder.campaigns
        f = current_folder
        while f.parent:
            tree.append(f.parent)
            f = f.parent
            tree.reverse()

    data = {
        'current_folder': current_folder,
        'tree': tree,
        'folders': folders,
        'characters': characters,
        'campaigns': campaigns
    }
    return render_template('content/folders.html.jinja',
                           new_folder_form=new_folder_form,
                           data=data)
Example #6
0
def register():
    if current_user.is_authenticated:
        return redirect(url_for('main.index'))
    form = RegistrationForm()
    if form.validate_on_submit():
        user = User(username=form.username.data, email=form.email.data)
        user.set_password(form.password.data)
        session.add(user)
        session.commit()
        flash('Congratulations, you are now a registered user!')
        return redirect(url_for('auth.login'))
    return render_template('auth/register.html.jinja',
                           title='Register',
                           form=form)
Example #7
0
def index():

    user_profile = UserProfile.query.get(current_user.id)

    if user_profile is None:
        user_profile = UserProfile(user_id=current_user.id)
        session.add(user_profile)
        session.commit()

    logger.info(f"Showing profile {user_profile.id}")

    characters = user_profile.characters
    folders = user_profile.folders  # .filter(Folder.parent_id.__eq__(None))
    return render_template('profile/profile.html.jinja',
                           profile=user_profile,
                           characters=characters,
                           folders=folders)
Example #8
0
def view(id, character, editable):
    subskillform = SubskillForm(prefix="subskillform")
    if editable and subskillform.data and subskillform.validate_on_submit():
        character.add_subskill(subskillform.name.data,
                               subskillform.parent.data)
        logentry = LogEntry(character,
                            f"add subskill {subskillform.name.data} " +
                            f"under {subskillform.parent.data}",
                            user_id=current_user.id)
        session.add(logentry)

        character.store_data()
        session.commit()
        return redirect(url_for('character.view', id=id))

    skillform = SkillForm(prefix="skillform")
    if editable and skillform.data and skillform.validate_on_submit():
        skills = character.skills()
        for skill in skills:
            if skillform.name.data == skill['name']:
                flash("Skill already exists")
                return redirect(url_for('character.view', id=id))

        character.add_skill(skillform.name.data)
        character.store_data()
        logentry = LogEntry(character,
                            f"add skill {subskillform.name.data}",
                            user_id=current_user.id)
        session.add(logentry)

        session.commit()
        return redirect(url_for('character.view', id=id))

    typeheader = "1920s Era Investigator"
    if character.game and character.game[1] == "Modern":
        typeheader = "Modern Era"

    shared = Invite.query_for(character).count()

    return render_template('character/coc7e/sheet.html.jinja',
                           shared=shared,
                           character=character,
                           typeheader=typeheader,
                           editable=editable,
                           skillform=skillform,
                           subskillform=subskillform)
Example #9
0
def manage_npc(id: int, npcid: int):
    npc = NPC.query.get(npcid)

    transferform = NPCTransferForm(prefix="npctransfer", npc_id=npcid)

    if npc is None:
        return abort(404)

    if npc.campaign_id != id:
        return abort(404)

    if current_user.profile != npc.campaign.user:
        return abort(404)

    if transferform.submit.data:
        if transferform.validate_on_submit():
            player = UserProfile.query.get(transferform.player.data)
            campaign = npc.campaign

            # Create a copy of the character
            new_character = Character(title=npc.character.title,
                                      body=npc.character.body,
                                      user_id=player.id)

            session.add(new_character)

            # Add the character to the campaign
            campaign.characters.append(new_character)

            # Remove the NPC
            session.delete(npc)

            # Commit changes
            session.commit()

            return redirect(url_for('campaign.view', id=campaign.id))

    transferform.player.choices = [(p.id, p.user.username)
                                   for p in npc.campaign.players]

    return render_template('campaign/managenpc.html.jinja',
                           npc=npc,
                           transferform=transferform)
Example #10
0
def import_character(type=None, id: int = None, code: str = None):
    logger.debug(f"{type}, {code}, {id}")
    character = None
    if id:
        character = get_character(id, check_author=True)
    elif code is not None:
        invite = Invite.query.get(code)
        if invite is None or invite.table != Character.__tablename__:
            return "Invalid code"
        character = Character.query.get(invite.object_id)

    form = ImportForm(obj=character)
    if form.validate_on_submit():
        c = Character(title=form.title.data,
                      body=form.body.data,
                      user_id=current_user.profile.id)
        session.add(c)
        session.commit()
        return redirect(url_for('character.view', id=c.id))
    return render_template('character/import.html.jinja', form=form, type=None)
Example #11
0
def create(chartype: str):

    character_module = globals()[chartype] if chartype in globals() else core

    form = getattr(character_module, 'CreateForm', CreateForm)()
    template = getattr(character_module, 'CREATE_TEMPLATE',
                       'character/create.html.jinja')

    if form.validate_on_submit():
        logger.debug(f"Creating new character specified by {form.data}")
        char_data = character_module.new_character(**form.data)
        c = Character(title=form.title.data,
                      body=char_data,
                      user_id=current_user.profile.id)
        session.add(c)
        session.commit()
        return redirect(url_for('character.view', id=c.id))

    form.system.data = chartype
    return render_template(template, form=form, type=type)
Example #12
0
def upload_file(folder_id=None):
    form = UploadForm(prefix='fileupload')
    if form.validate_on_submit():
        fileobject = form.uploaded.data
        folder: AssetFolder = AssetFolder.query.get(form.folder_id.data)

        if folder.owner != current_user.profile:
            abort(403)

        if fileobject.filename:
            filename = secure_filename(fileobject.filename)

            folder.system_path.mkdir(parents=True, exist_ok=True)
            fileobject.save(folder.system_path / filename)

            asset = Asset(filename=fileobject.filename,
                          folder=folder,
                          owner=current_user.profile)
            session.add(asset)
            session.commit()

    return redirect(url_for('userassets.index', folder_id=folder_id))
Example #13
0
def edit(id: int):
    c = Campaign.query.get(id)
    form = EditForm(obj=c, prefix="campaign_edit")
    folderform = ChooseFolderForm(prefix="choose_folder")

    if form.submit.data and form.validate_on_submit():
        form.populate_obj(c)
        session.add(c)
        session.commit()
        return redirect(url_for('campaign.view', id=c.id))

    if folderform.choose.data and folderform.validate_on_submit():
        print("Folder form submitted!")
        c.folder = folderform.folder_id.data
        session.commit()
        return redirect(url_for('campaign.view', id=c.id))

    folderform.folder_id.data = c.folder

    return render_template('campaign/edit.html.jinja',
                           form=form,
                           folderform=folderform)
Example #14
0
def share(id: int):
    """Share a character."""
    character = get_character(id, check_author=True)
    logger.debug("Finding previous invite")
    invite = Invite.query_for(character).first()
    logger.debug(f"Invites found {invite}")
    if not invite:
        logger.debug(f"Creating an invite for character {character.id}")
        invite = Invite(character)
        invite.owner_id = character.user_id
        session.add(invite)
        session.commit()

    share_url = url_for('character.shared', code=invite.id, _external=True)

    form = None

    html_response = render_template('character/api_share.html.jinja',
                                    form=form,
                                    url=share_url,
                                    code=invite.id)

    return jsonify({'url': share_url, 'html': html_response})
Example #15
0
def index(folder_id=None):
    if current_user.profile.assetfolders.count() < 1:
        logger.debug("Creating initial folder")
        rootfolder = AssetFolder(title='assets', owner=current_user.profile)
        session.add(rootfolder)
        session.commit()

    if folder_id is not None:
        folder = AssetFolder.query.get(folder_id)
    else:
        folder = current_user.profile.assetfolders \
            .filter(AssetFolder.parent_id.__eq__(None)).first()

    form = UploadForm(folder_id=folder.id, prefix="fileupload")
    folderform = NewFolderForm(parent_id=folder.id, prefix="newfolderform")
    deletefolderform = DeleteAssetFolderForm(id=folder.id,
                                             prefix="deletefolderform")

    return render_template('userassets/assets.html.jinja',
                           form=form,
                           folderform=folderform,
                           deletefolderform=deletefolderform,
                           folder=folder)
Example #16
0
def message_player(campaign_id: int, player_id: int = None):
    c = Campaign.query.get(campaign_id)
    player = None
    if player_id:
        player = UserProfile.query.get(player_id)

    form = MessagePlayerForm()

    if form.validate_on_submit():
        flash(form.message.data)
        logger.debug(request.form)

        message = Message()
        form.populate_obj(message)
        if not form.to_id.data:
            message.to_id = None  # type: ignore

        session.add(message)
        session.commit()

        return redirect(url_for('campaign.view', id=c.id))

    form.campaign_id.data = c.id
    form.to_id.data = player_id
    form.from_id.data = c.user_id

    messages = c.messages.filter(
        or_(
            and_(Message.to_id == player_id,
                 Message.from_id == current_user.profile.id),
            and_(Message.to_id == current_user.profile.id,
                 Message.from_id == player_id)))
    return render_template('campaign/message_player.html.jinja',
                           player=player,
                           campaign=c,
                           form=form,
                           messages=messages)
Example #17
0
def add_first_admin(*args, **kwargs):
    session.add(UserRoles(user_id=1, role_id=1))
    session.commit()
Example #18
0
def create_core_roles(*args, **kwargs):
    session.add(Role(name='admin'))
    session.commit()
Example #19
0
def view(id: int):
    invites = None
    campaign: Campaign = Campaign.query.get(id)

    # Set up forms
    inviteform = InvitePlayerForm(prefix="inviteform")
    createinviteform = CreateInviteForm(prefix="createinviteform")
    characterform = AddCharacterForm(prefix="characterform")
    npcform = AddNPCForm(prefix="npcform")

    messageform = MessagePlayerForm(players=[
        (campaign.user_id, "GM"),
    ] + [(p.id, p.user.username) for p in campaign.players],
                                    campaign_id=campaign.id,
                                    from_id=current_user.profile.id)

    is_player = current_user.profile in campaign.players
    is_owner = current_user and current_user.profile.id == campaign.user_id

    logger.debug(f"Viewing campagin {campaign.title}")
    logger.debug(f"There are {campaign.players.count()} players")
    logger.debug(f"There are {campaign.characters.count()} characters")

    if not is_player and not is_owner:
        abort(404, "This is not the campaign your are looking for.")

    if is_owner:
        if createinviteform.submit.data and \
                createinviteform.validate_on_submit():
            invite = Invite(campaign)
            invite.owner_id = campaign.user_id  # type: ignore
            session.add(invite)
            session.commit()

        if inviteform.submit.data and inviteform.validate_on_submit():
            player = (User.query.filter_by(
                email=inviteform.email.data).first().profile)
            campaign.players.append(player)
            session.commit()
            return redirect(url_for('campaign.view', id=id))

        invites = Invite.query_for(campaign)

        if npcform.submit.data and npcform.validate_on_submit():
            print("Adding NPC")
            character = npcform.character.data
            npc = NPC(character=character, campaign=campaign)
            session.add(npc)
            session.commit()

            return redirect(url_for('campaign.view', id=id))

    if characterform.submit.data and characterform.validate_on_submit():
        print("Adding character")
        character = characterform.character.data
        if (character not in campaign.characters
                and character.user_id == current_user.profile.id):
            campaign.characters.append(character)
            session.commit()
        else:
            flash("Character is already added to campaign")

        return redirect(url_for('campaign.view', id=id))

    createinviteform.submit.label.text = "Create share link."

    handouts = campaign.handouts.filter_by(status=HandoutStatus.visible)
    messages = campaign.messages.filter(
        or_(Message.from_id == current_user.profile.id,
            Message.to_id == current_user.profile.id, Message.to_id.is_(None)))

    added_npc_ids = [c.character_id for c in campaign.NPCs]

    npcform.character.query = current_user.profile.characters.filter(
        Character.id.notin_(added_npc_ids)).\
        order_by(
            Character.folder_id.__eq__(campaign.folder_id).desc()).\
        order_by('title')

    added_character_ids = [c.id for c in campaign.characters]
    characterform.character.query = current_user.profile.characters.\
        filter(Character.id.notin_(added_character_ids)).\
        order_by(Character.folder_id.__eq__(campaign.folder_id).desc()).\
        order_by('title')

    return render_template('campaign/campaign.html.jinja',
                           campaign=campaign,
                           handouts=handouts,
                           invites=invites,
                           inviteform=inviteform,
                           createinviteform=createinviteform,
                           characterform=characterform,
                           messages=messages,
                           npcform=npcform,
                           editable=is_owner,
                           messageform=messageform)