示例#1
0
    def __init__(self, current_user=None, *args, **kwargs):
        """Override for form initialization"""
        super().__init__(*args, **kwargs)

        self.current_user = current_user

        # Default field modifications
        self.fields['description'].required = False
        self.fields['secret'].widget = forms.TextInput(
            attrs={'class': "sodar-code-input"})
        self.fields['description'].widget.attrs['rows'] = 4

        # Special cases for SOURCE
        if settings.PROJECTROLES_SITE_MODE == SITE_MODE_SOURCE:
            self.fields['secret'].widget.attrs['readonly'] = True
            self.fields['user_display'].widget = forms.CheckboxInput()
        elif settings.PROJECTROLES_SITE_MODE == SITE_MODE_TARGET:
            self.fields['user_display'].widget = forms.HiddenInput()

        self.fields['user_display'].initial = True

        # Creation
        if not self.instance.pk:
            # Generate secret token for target site
            if settings.PROJECTROLES_SITE_MODE == SITE_MODE_SOURCE:
                self.fields['secret'].initial = build_secret()

        # Updating
        else:
            pass
示例#2
0
 def update(self, instance, validated_data):
     if instance.public_url != bool(
         validated_data.get('public_url', instance.public_url)
     ):
         instance.secret = build_secret()
         instance.save()
     return super().update(instance, validated_data)
示例#3
0
    def save(self, *args, **kwargs):
        """Override of form saving function"""
        obj = super().save(commit=False)

        obj.project = self.project
        obj.issuer = self.current_user
        obj.date_expire = timezone.now() + timezone.timedelta(
            days=INVITE_EXPIRY_DAYS)
        obj.secret = build_secret()

        obj.save()
        return obj
示例#4
0
 def _make_file():
     file = self._make_file(
         name='file2.txt',
         file_name='file2.txt',
         file_content=self.file_content,
         project=self.project,
         folder=None,
         owner=self.owner_as.user,
         description='',
         public_url=True,
         secret=build_secret(),
     )
     file.sodar_uuid = obj_uuid
     file.save()
示例#5
0
 def _make_site(
     cls,
     name,
     url,
     mode=SODAR_CONSTANTS['SITE_MODE_TARGET'],
     description='',
     secret=build_secret(),
 ):
     """Make and save a RemoteSite"""
     values = {
         'name': name,
         'url': url,
         'mode': mode,
         'description': description,
         'secret': secret,
     }
     site = RemoteSite(**values)
     site.save()
     return site
示例#6
0
    def save(self, *args, **kwargs):
        """Override of form saving function"""
        obj = super().save(commit=False)

        # Creation
        if not self.instance.pk:
            obj.name = obj.file.name
            obj.owner = self.current_user
            obj.project = self.project

            if self.folder:
                obj.folder = self.folder

            obj.secret = build_secret()  # Secret string created here

        # Updating
        else:
            old_file = File.objects.get(pk=self.instance.pk)

            if old_file.file != self.instance.file:
                obj.file = self.instance.file
                obj.name = obj.file.name.split('/')[-1]

            obj.owner = self.instance.owner
            obj.project = self.instance.project

            if app_settings.get_app_setting(APP_NAME,
                                            'allow_public_links',
                                            project=self.instance.project):
                obj.public_url = self.instance.public_url

            else:
                obj.public_url = False

            obj.secret = self.instance.secret

            if self.instance.folder:
                obj.folder = self.instance.folder

        obj.save()
        return obj
示例#7
0
    def _set_up_as_target(cls, projects):
        """Set up current site as a target site"""
        source_site = cls._make_site(
            name='Test Source',
            url='http://0.0.0.0',
            mode=SITE_MODE_SOURCE,
            description='',
            secret=build_secret(),
        )

        remote_projects = []

        for project in projects:
            remote_projects.append(
                cls._make_remote_project(
                    project_uuid=project.sodar_uuid,
                    project=project,
                    site=source_site,
                    level=SODAR_CONSTANTS['REMOTE_LEVEL_READ_ROLES'],
                ))

        return source_site, remote_projects
PROJECT_TYPE_CATEGORY = SODAR_CONSTANTS['PROJECT_TYPE_CATEGORY']
PROJECT_TYPE_PROJECT = SODAR_CONSTANTS['PROJECT_TYPE_PROJECT']
SUBMIT_STATUS_OK = SODAR_CONSTANTS['SUBMIT_STATUS_OK']
SUBMIT_STATUS_PENDING = SODAR_CONSTANTS['SUBMIT_STATUS_PENDING']
SUBMIT_STATUS_PENDING_TASKFLOW = SODAR_CONSTANTS['SUBMIT_STATUS_PENDING']
SITE_MODE_TARGET = SODAR_CONSTANTS['SITE_MODE_TARGET']
SITE_MODE_SOURCE = SODAR_CONSTANTS['SITE_MODE_SOURCE']
REMOTE_LEVEL_VIEW_AVAIL = SODAR_CONSTANTS['REMOTE_LEVEL_VIEW_AVAIL']
REMOTE_LEVEL_READ_INFO = SODAR_CONSTANTS['REMOTE_LEVEL_READ_INFO']
REMOTE_LEVEL_READ_ROLES = SODAR_CONSTANTS['REMOTE_LEVEL_READ_ROLES']

# Local constants
SOURCE_SITE_NAME = 'Test source site'
SOURCE_SITE_URL = 'https://sodar.bihealth.org'
SOURCE_SITE_DESC = 'Source description'
SOURCE_SITE_SECRET = build_secret()

SOURCE_USER_DOMAIN = 'TESTDOMAIN'
SOURCE_USER_USERNAME = '******' + SOURCE_USER_DOMAIN
SOURCE_USER_GROUP = SOURCE_USER_DOMAIN.lower()
SOURCE_USER_NAME = 'Firstname Lastname'
SOURCE_USER_FIRST_NAME = SOURCE_USER_NAME.split(' ')[0]
SOURCE_USER_LAST_NAME = SOURCE_USER_NAME.split(' ')[1]
SOURCE_USER_EMAIL = SOURCE_USER_USERNAME.split('@')[0] + '@example.com'
SOURCE_USER_UUID = str(uuid.uuid4())

SOURCE_CATEGORY_UUID = str(uuid.uuid4())
SOURCE_CATEGORY_TITLE = 'TestCategory'
SOURCE_PROJECT_UUID = str(uuid.uuid4())
SOURCE_PROJECT_TITLE = 'TestProject'
SOURCE_PROJECT_DESCRIPTION = 'Description'
示例#9
0
文件: views.py 项目: langk/sodar_core
    def form_valid(self, form):
        """Override form_valid() for zip file unpacking"""
        timeline = get_backend_api('timeline_backend')

        ######################
        # Regular file upload
        ######################

        if not form.cleaned_data.get('unpack_archive'):
            return super().form_valid(form)

        #####################
        # Zip file unpacking
        #####################

        file = form.cleaned_data.get('file')
        folder = form.cleaned_data.get('folder')
        project = self.get_project(self.request, self.kwargs)

        # Build redirect URL
        # TODO: Repetition, put this in a mixin?
        if folder:
            re_kwargs = {'folder': folder.sodar_uuid}

        else:
            re_kwargs = {'project': project.sodar_uuid}

        redirect_url = reverse('filesfolders:list', kwargs=re_kwargs)

        try:
            zip_file = ZipFile(file)

        except Exception as ex:
            messages.error(self.request,
                           'Unable to extract zip file: {}'.format(ex))
            return redirect(redirect_url)

        new_folders = []
        new_files = []

        with transaction.atomic():
            for f in [f for f in zip_file.infolist() if not f.is_dir()]:
                # Create subfolders if any
                current_folder = folder

                for zip_folder in f.filename.split('/')[:-1]:
                    try:
                        current_folder = Folder.objects.get(
                            name=zip_folder,
                            project=project,
                            folder=current_folder,
                        )

                    except Folder.DoesNotExist:
                        current_folder = Folder.objects.create(
                            name=zip_folder,
                            project=project,
                            folder=current_folder,
                            owner=self.request.user,
                        )
                        new_folders.append(current_folder)

                # Save file
                file_name_nopath = f.filename.split('/')[-1]

                unpacked_file = File(
                    name=file_name_nopath,
                    project=project,
                    folder=current_folder,
                    owner=self.request.user,
                    secret=build_secret(),
                )
                content_file = ContentFile(zip_file.read(f.filename))
                unpacked_file.file.save(file_name_nopath, content_file)
                unpacked_file.save()
                new_files.append(unpacked_file)

        # Add timeline events
        for new_folder in new_folders:
            self._add_item_modify_event(obj=new_folder,
                                        request=self.request,
                                        view_action='create')

        for new_file in new_files:
            self._add_item_modify_event(obj=new_file,
                                        request=self.request,
                                        view_action='create')

        if timeline:
            timeline.add_event(
                project=project,
                app_name=APP_NAME,
                user=self.request.user,
                event_name='archive_extract',
                description='Extract from archive "{}", create {} folders '
                'and {} files'.format(file.name, len(new_folders),
                                      len(new_files)),
                extra_data={
                    'new_folders': [f.name for f in new_folders],
                    'new_files': [f.name for f in new_files],
                },
                status_type='OK',
            )

        messages.success(
            self.request,
            'Extracted {} files in folder "{}" from archive "{}"'.format(
                len([f for f in zip_file.infolist() if not f.is_dir()]),
                folder.name if folder else 'root',
                file.name,
            ),
        )
        return redirect(redirect_url)
示例#10
0
PROJECT_TYPE_PROJECT = SODAR_CONSTANTS['PROJECT_TYPE_PROJECT']
SUBMIT_STATUS_OK = SODAR_CONSTANTS['SUBMIT_STATUS_OK']
SUBMIT_STATUS_PENDING = SODAR_CONSTANTS['SUBMIT_STATUS_PENDING']
SUBMIT_STATUS_PENDING_TASKFLOW = SODAR_CONSTANTS['SUBMIT_STATUS_PENDING']
SITE_MODE_TARGET = SODAR_CONSTANTS['SITE_MODE_TARGET']
SITE_MODE_SOURCE = SODAR_CONSTANTS['SITE_MODE_SOURCE']

# Settings
INVITE_EXPIRY_DAYS = settings.PROJECTROLES_INVITE_EXPIRY_DAYS

# Local constants
SECRET = 'rsd886hi8276nypuvw066sbvv0rb2a6x'
EXAMPLE_APP_NAME = 'example_project_app'
REMOTE_SITE_NAME = 'Test site'
REMOTE_SITE_URL = 'https://sodar.example.org'
REMOTE_SITE_SECRET = build_secret()
REMOTE_SITE_USER_DISPLAY = True


class ProjectMixin:
    """Helper mixin for Project creation"""
    @classmethod
    def _make_project(
        cls,
        title,
        type,
        parent,
        description='',
        submit_status=SUBMIT_STATUS_OK,
        readme=None,
        sodar_uuid=None,
示例#11
0
    def setUp(self):
        super().setUp()

        app_settings.set_app_setting(APP_NAME,
                                     'allow_public_links',
                                     True,
                                     project=self.project)

        self.file_content = bytes('content'.encode('utf-8'))
        self.secret_file_owner = build_secret()
        self.secret_file_contributor = build_secret()

        # Init folders

        # Folder created by project owner
        self.folder_owner = self._make_folder(
            name='folder_owner',
            project=self.project,
            folder=None,
            owner=self.user_owner,
            description='',
        )

        # File created by project contributor
        self.folder_contributor = self._make_folder(
            name='folder_contributor',
            project=self.project,
            folder=None,
            owner=self.user_contributor,
            description='',
        )

        # Init files

        # File uploaded by project owner
        self.file_owner = self._make_file(
            name='file_owner.txt',
            file_name='file_owner.txt',
            file_content=self.file_content,
            project=self.project,
            folder=None,
            owner=self.user_owner,
            description='',
            public_url=True,  # NOTE: Public URL OK
            secret=self.secret_file_owner,
        )

        # File uploaded by project contributor
        self.file_contributor = self._make_file(
            name='file_contributor.txt',
            file_name='file_contributor.txt',
            file_content=self.file_content,
            project=self.project,
            folder=None,
            owner=self.user_contributor,
            description='',
            public_url=False,  # NOTE: No public URL
            secret=self.secret_file_contributor,
        )

        # Init hyperlinks

        # HyperLink added by project owner
        self.hyperlink_owner = self._make_hyperlink(
            name='Owner link',
            url='https://www.bihealth.org/',
            project=self.project,
            folder=None,
            owner=self.user_owner,
            description='',
        )

        # HyperLink added by project contributor
        self.hyperlink_contrib = self._make_hyperlink(
            name='Contributor link',
            url='http://www.google.com/',
            project=self.project,
            folder=None,
            owner=self.user_contributor,
            description='',
        )
示例#12
0
 def create(self, validated_data):
     instance = super().create(validated_data)
     instance.secret = build_secret()
     instance.save()
     return instance