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
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)
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
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()
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
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
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'
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)
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,
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='', )
def create(self, validated_data): instance = super().create(validated_data) instance.secret = build_secret() instance.save() return instance