Ejemplo n.º 1
0
    def get_context_data(self, **kwargs):
        context = super(ProjectDetailView, self).get_context_data(**kwargs)
        project = context['project']
        ancestors = project.get_ancestors(include_self=True)

        highest = Membership.objects.filter(
            project__in=ancestors,
            user_id=OuterRef('user_id')).order_by('-project__level')
        memberships = Membership.objects.filter(project__in=ancestors) \
                                        .annotate(highest=Subquery(highest.values('project__level')[:1])) \
                                        .filter(highest=F('project__level')) \
                                        .select_related('user')

        integrations = Integration.objects.filter(project__in=ancestors)
        context['memberships'] = memberships.order_by('user__last_name',
                                                      '-project__level')
        context['integrations'] = integrations.order_by(
            'provider_key', '-project__level')
        context['providers'] = get_plugins('SERVICE_PROVIDERS')
        context['issues'] = project.issues.active()
        context['snapshots'] = project.snapshots.all()
        context['invites'] = project.invites.all()
        context['membership'] = Membership.objects.filter(
            project=project, user=self.request.user).first()

        return context
Ejemplo n.º 2
0
    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        current_project = self.object

        try:
            uploaded_file = request.FILES['uploaded_file']
        except KeyError:
            return HttpResponseRedirect(self.get_success_url())
        else:
            import_tmpfile_name = handle_uploaded_file(uploaded_file)

        for import_key, import_plugin in get_plugins(
                'PROJECT_IMPORTS').items():
            import_plugin.file_name = import_tmpfile_name
            import_plugin.current_project = current_project

            if import_plugin.check():
                try:
                    import_plugin.process()
                except ValidationError as e:
                    return render(request,
                                  'core/error.html', {
                                      'title': _('Import error'),
                                      'errors': e
                                  },
                                  status=400)

                # store information in session for ProjectCreateImportView
                request.session[
                    'update_import_tmpfile_name'] = import_tmpfile_name
                request.session['update_import_key'] = import_key

                return render(
                    request, 'projects/project_upload.html', {
                        'file_name': uploaded_file.name,
                        'current_project': current_project,
                        'values': import_plugin.values,
                        'tasks': import_plugin.tasks,
                        'views': import_plugin.views
                    })

        return render(
            request,
            'core/error.html', {
                'title': _('Import error'),
                'errors': [_('Files of this type cannot be imported.')]
            },
            status=400)
Ejemplo n.º 3
0
    def get_context_data(self, **kwargs):
        context = super(ProjectDetailView, self).get_context_data(**kwargs)
        project = context['project']

        context['memberships'] = []
        for membership in Membership.objects.filter(
                project=project).order_by('user__last_name'):
            context['memberships'].append({
                'id':
                membership.id,
                'user':
                membership.user,
                'role':
                dict(Membership.ROLE_CHOICES)[membership.role],
                'last_owner':
                is_last_owner(project, membership.user),
            })

        context['providers'] = get_plugins('SERVICE_PROVIDERS')
        context['integrations'] = project.integrations.all()
        context['issues'] = project.issues.active()
        context['snapshots'] = project.snapshots.all()
        return context
Ejemplo n.º 4
0
    def get_context_data(self, **kwargs):
        context = super(ProjectDetailView, self).get_context_data(**kwargs)
        project = context['project']
        ancestors = project.get_ancestors(include_self=True)
        values = project.values.filter(snapshot=None).select_related('attribute', 'option')
        highest = Membership.objects.filter(project__in=ancestors, user_id=OuterRef('user_id')).order_by('-project__level')
        memberships = Membership.objects.filter(project__in=ancestors) \
                                        .annotate(highest=Subquery(highest.values('project__level')[:1])) \
                                        .filter(highest=F('project__level')) \
                                        .select_related('user')

        integrations = Integration.objects.filter(project__in=ancestors)
        context['catalogs'] = Catalog.objects.filter_current_site() \
                                             .filter_group(self.request.user) \
                                             .filter_availability(self.request.user)
        context['memberships'] = memberships.order_by('user__last_name', '-project__level')
        context['integrations'] = integrations.order_by('provider_key', '-project__level')
        context['providers'] = get_plugins('PROJECT_ISSUE_PROVIDERS')
        context['issues'] = [issue for issue in project.issues.all() if issue.resolve(values)]
        context['snapshots'] = project.snapshots.all()
        context['invites'] = project.invites.all()
        context['membership'] = Membership.objects.filter(project=project, user=self.request.user).first()

        return context
Ejemplo n.º 5
0
    def import_form(self):
        current_project = self.object

        import_file_name = self.request.session.get('import_file_name')
        import_source_title = self.request.session.get('import_source_title')
        if import_file_name is None or not Path(import_file_name).is_file():
            return render(
                self.request,
                'core/error.html', {
                    'title':
                    _('Import error'),
                    'errors': [
                        _('There has been an error with your import. No uploaded or retrieved file could be found.'
                          )
                    ]
                },
                status=400)

        for import_key, import_plugin in get_plugins(
                'PROJECT_IMPORTS').items():
            import_plugin.current_project = current_project
            import_plugin.file_name = import_file_name
            import_plugin.source_title = import_source_title

            if import_plugin.upload and import_plugin.check():
                try:
                    import_plugin.process()
                except ValidationError as e:
                    return render(self.request,
                                  'core/error.html', {
                                      'title': _('Import error'),
                                      'errors': e
                                  },
                                  status=400)

                # store information in session for ProjectCreateImportView
                self.request.session['import_key'] = import_key

                # attach questions and current values
                self.update_values(current_project, import_plugin.catalog,
                                   import_plugin.values,
                                   import_plugin.snapshots)

                return render(
                    self.request, 'projects/project_import.html', {
                        'method':
                        'import_file',
                        'current_project':
                        current_project,
                        'source_title':
                        import_plugin.source_title,
                        'source_project':
                        import_plugin.project,
                        'values':
                        import_plugin.values,
                        'snapshots':
                        import_plugin.snapshots
                        if not current_project else None,
                        'tasks':
                        import_plugin.tasks,
                        'views':
                        import_plugin.views
                    })

        return render(
            self.request,
            'core/error.html', {
                'title': _('Import error'),
                'errors': [_('Files of this type cannot be imported.')]
            },
            status=400)
Ejemplo n.º 6
0
    def upload_file(self):
        current_project = self.object

        try:
            uploaded_file = self.request.FILES['uploaded_file']
        except KeyError:
            return None
        else:
            import_tmpfile_name = handle_uploaded_file(uploaded_file)

        for import_key, import_plugin in get_plugins(
                'PROJECT_IMPORTS').items():
            import_plugin.file_name = import_tmpfile_name
            import_plugin.current_project = current_project

            if import_plugin.check():
                try:
                    import_plugin.process()
                except ValidationError as e:
                    return render(self.request,
                                  'core/error.html', {
                                      'title': _('Import error'),
                                      'errors': e
                                  },
                                  status=400)

                # store information in session for ProjectCreateImportView
                self.request.session[
                    'update_import_tmpfile_name'] = import_tmpfile_name
                self.request.session['update_import_key'] = import_key

                # attach questions and current values
                self.update_values(current_project, import_plugin.catalog,
                                   import_plugin.values,
                                   import_plugin.snapshots)

                return render(
                    self.request, 'projects/project_import.html', {
                        'method':
                        'import_file',
                        'current_project':
                        current_project,
                        'source_title':
                        uploaded_file.name,
                        'source_project':
                        import_plugin.project,
                        'values':
                        import_plugin.values,
                        'snapshots':
                        import_plugin.snapshots if current_project else None,
                        'tasks':
                        import_plugin.tasks,
                        'views':
                        import_plugin.views
                    })

        return render(
            self.request,
            'core/error.html', {
                'title': _('Import error'),
                'errors': [_('Files of this type cannot be imported.')]
            },
            status=400)
Ejemplo n.º 7
0
def get_widget_types():
    widgets = get_plugins('QUESTIONS_WIDGETS')
    return [widget.key for widget in widgets.values()]
Ejemplo n.º 8
0
def get_widgets():
    widgets = get_plugins('QUESTIONS_WIDGETS')
    return widgets.values()
Ejemplo n.º 9
0
def get_widget_type_choices():
    widgets = get_plugins('QUESTIONS_WIDGETS')
    return [(widget.key, widget.label) for widget in widgets.values()]