Exemple #1
0
    def _process(self):
        step = int(request.form.get('step', 1))
        form = self._form_for_step(step, set_defaults=True)
        prev_form = self._form_for_step(step - 1)

        if prev_form and not prev_form.validate():
            form = prev_form
            step = step - 1

        elif step > 2:
            # last step - perform actual cloning
            form = ImportContentsForm(self.source_event, self.event)

            if form.validate_on_submit():
                updated_event = clone_into_event(self.source_event, self.event,
                                                 set(form.selected_items.data))
                flash(_('Import successful!'), 'success')
                return jsonify_data(redirect=url_for(
                    'event_management.settings', updated_event),
                                    flash=False)
            else:
                # back to step 2, since there's been an error
                step = 2
        dependencies = {
            c.name: {
                'requires': list(c.requires_deep),
                'required_by': list(c.required_by_deep)
            }
            for c in EventCloner.get_cloners(self.event)
        }
        return jsonify_template('events/management/import_event.html',
                                event=self.event,
                                step=step,
                                form=form,
                                cloner_dependencies=dependencies)
Exemple #2
0
    def __init__(self, event, set_defaults=False, **kwargs):
        options = EventCloner.get_cloners(event)
        visible_options = filter(attrgetter('is_visible'), options)
        default_selected_items = kwargs.get(
            'selected_items',
            [option.name for option in options if option.is_default])

        if set_defaults:
            default_category = kwargs['category'][
                'id'] if 'category' in kwargs else None
            form_params = {
                'repeatability':
                request.form.get('repeatability',
                                 kwargs.pop('repeatability', None)),
                'selected_items': (request.form.getlist('selected_items')
                                   or default_selected_items),
                'category':
                request.form.get('category', default_category),
                'csrf_token':
                request.form.get('csrf_token')
            }
            kwargs['formdata'] = ImmutableMultiDict(form_params)

        super(CloneContentsForm, self).__init__(**kwargs)
        self.selected_items.choices = [(option.name, option.friendly_name)
                                       for option in visible_options]
        self.selected_items.disabled_choices = [
            option.name for option in visible_options
            if not option.is_available
        ]
Exemple #3
0
    def _process(self):
        step = int(request.form.get('step', 1))
        tpl_args = {}
        form = self._form_for_step(step, set_defaults=True)
        prev_form = self._form_for_step(step - 1)

        if prev_form and not prev_form.validate():
            form = prev_form
            step = step - 1

        if step == 4:
            tpl_args.update({
                'step_title':
                dict(CLONE_REPEAT_CHOICES)[request.form['repeatability']],
            })
        elif step > 4:
            # last step - perform actual cloning
            form = REPEAT_FORM_MAP[request.form['repeatability']](
                self.event_new)

            if form.validate_on_submit():
                if form.repeatability.data == 'once':
                    dates = [form.start_dt.data]
                else:
                    clone_calculator = get_clone_calculator(
                        form.repeatability.data, self.event_new)
                    dates = clone_calculator.calculate(request.form)
                clones = [
                    clone_event(self.event_new, start_dt,
                                set(form.selected_items.data),
                                form.category.data) for start_dt in dates
                ]
                if len(clones) == 1:
                    flash(_('Welcome to your cloned event!'), 'success')
                    return jsonify_data(redirect=url_for(
                        'event_management.settings', clones[0]),
                                        flash=False)
                else:
                    flash(
                        _('{} new events created.').format(len(dates)),
                        'success')
                    return jsonify_data(redirect=form.category.data.url,
                                        flash=False)
            else:
                # back to step 4, since there's been an error
                step = 4
        dependencies = {
            c.name: {
                'requires': list(c.requires_deep),
                'required_by': list(c.required_by_deep)
            }
            for c in EventCloner.get_cloners(self.event_new)
        }
        return jsonify_template('events/management/clone_event.html',
                                event=self.event_new,
                                step=step,
                                form=form,
                                cloner_dependencies=dependencies,
                                **tpl_args)
Exemple #4
0
    def __init__(self,
                 source_event,
                 target_event,
                 set_defaults=False,
                 **kwargs):
        cloners = EventCloner.get_cloners(source_event)
        visible_options = [
            cloner for cloner in cloners
            if cloner.is_visible and not cloner.new_event_only
        ]
        conflicts = {
            cloner.name: cloner.get_conflicts(target_event)
            for cloner in cloners
        }
        cloners_with_conflicts = {
            name
            for name in conflicts if conflicts[name]
        }

        if set_defaults:
            form_params = {
                'source_event_url':
                request.form.get('source_event_url',
                                 kwargs.pop('source_event_url', None)),
                'selected_items':
                request.form.getlist('selected_items'),
                'csrf_token':
                request.form.get('csrf_token')
            }
            kwargs['formdata'] = ImmutableMultiDict(form_params)

        super().__init__(**kwargs)
        self.selected_items.choices = [(option.name, option.friendly_name)
                                       for option in visible_options]
        # We disable all cloners that are not available, handle only cloning to new events,
        # have conflicts with target_event or any of their dependencies have conflicts with target_event
        disabled_choices = []
        reasons = {}
        for option in visible_options:
            if not option.is_available:
                disabled_choices.append(option.name)
                reasons[option.name] = _('There is nothing to import')
            elif conflict := conflicts[option.name]:
                disabled_choices.append(option.name)
                reasons[option.name] = '\n'.join(conflict)
            elif cloners_with_conflicts & option.requires_deep:
                disabled_choices.append(option.name)
                reasons[option.name] = _(
                    'This option depends on other options which are unavailable'
                )
Exemple #5
0
    def __init__(self, event, set_defaults=False, **kwargs):
        options = EventCloner.get_cloners(event)
        visible_options = filter(attrgetter('is_visible'), options)
        default_selected_items = kwargs.get('selected_items', [option.name for option in options if option.is_default])

        if set_defaults:
            default_category = kwargs['category']['id'] if 'category' in kwargs else None
            form_params = {
                'repeatability': request.form.get('repeatability', kwargs.pop('repeatability', None)),
                'selected_items': (request.form.getlist('selected_items') or default_selected_items),
                'category': request.form.get('category', default_category),
                'csrf_token': request.form.get('csrf_token')
            }
            kwargs['formdata'] = ImmutableMultiDict(form_params)

        super(CloneContentsForm, self).__init__(**kwargs)
        self.selected_items.choices = [(option.name, option.friendly_name) for option in visible_options]
        self.selected_items.disabled_choices = [option.name for option in visible_options if not option.is_available]
Exemple #6
0
    def __init__(self, source_event, target_event, set_defaults=False, **kwargs):
        cloners = EventCloner.get_cloners(source_event)
        visible_options = [cloner for cloner in cloners if cloner.is_visible and not cloner.new_event_only]
        conflicts = {cloner.name: cloner.has_conflicts(target_event) for cloner in cloners}

        if set_defaults:
            form_params = {
                'source_event_url': request.form.get('source_event_url', kwargs.pop('source_event_url', None)),
                'selected_items': request.form.getlist('selected_items'),
                'csrf_token': request.form.get('csrf_token')
            }
            kwargs['formdata'] = ImmutableMultiDict(form_params)

        super().__init__(**kwargs)
        self.selected_items.choices = [(option.name, option.friendly_name) for option in visible_options]
        # We disable all cloners that are not available, handle only cloning to new events,
        # have conflicts with target_event or any of their dependencies has conflicts with target_event
        self.selected_items.disabled_choices = [option.name for option in visible_options if not option.is_available
                                                or conflicts[option.name]
                                                or any(conflicts[dep] for dep in option.requires)]
Exemple #7
0
    def _process(self):
        step = int(request.form.get('step', 1))
        tpl_args = {}
        form = self._form_for_step(step, set_defaults=True)
        prev_form = self._form_for_step(step - 1)

        if prev_form and not prev_form.validate():
            form = prev_form
            step = step - 1

        if step == 4:
            tpl_args.update({
                'step_title': dict(CLONE_REPEAT_CHOICES)[request.form['repeatability']],
            })
        elif step > 4:
            # last step - perform actual cloning
            form = REPEAT_FORM_MAP[request.form['repeatability']](self.event)

            if form.validate_on_submit():
                if form.repeatability.data == 'once':
                    dates = [form.start_dt.data]
                else:
                    clone_calculator = get_clone_calculator(form.repeatability.data, self.event)
                    dates = clone_calculator.calculate(request.form)
                clones = [clone_event(self.event, start_dt, set(form.selected_items.data), form.category.data)
                          for start_dt in dates]
                if len(clones) == 1:
                    flash(_('Welcome to your cloned event!'), 'success')
                    return jsonify_data(redirect=url_for('event_management.settings', clones[0]), flash=False)
                else:
                    flash(_('{} new events created.').format(len(dates)), 'success')
                    return jsonify_data(redirect=form.category.data.url, flash=False)
            else:
                # back to step 4, since there's been an error
                step = 4
        dependencies = {c.name: {'requires': list(c.requires_deep), 'required_by': list(c.required_by_deep)}
                        for c in EventCloner.get_cloners(self.event)}
        return jsonify_template('events/management/clone_event.html', event=self.event, step=step, form=form,
                                cloner_dependencies=dependencies, **tpl_args)