def publish_project_xform(request, project): def set_form(): props = { 'project': project.pk, 'dropbox_xls_url': request.DATA.get('dropbox_xls_url'), 'xls_url': request.DATA.get('xls_url'), 'csv_url': request.DATA.get('csv_url') } form = QuickConverter(props, request.FILES) return form.publish(project.organization, created_by=request.user) xform = None if 'formid' in request.DATA: xform = get_object_or_404(XForm, pk=request.DATA.get('formid')) if not ManagerRole.user_has_role(request.user, xform): raise exceptions.PermissionDenied(_( "{} has no manager/owner role to the form {}". format( request.user, xform))) xform.project = project xform.save() set_project_perms_to_xform(xform, project) else: xform = publish_form(set_form) return xform
def set_object_permissions(sender, instance=None, created=False, **kwargs): # seems the super is not called, have to get xform from here xform = XForm.objects.get(pk=instance.pk) if created: from onadata.libs.permissions import OwnerRole OwnerRole.add(instance.user, xform) if instance.created_by and instance.user != instance.created_by: OwnerRole.add(instance.created_by, xform) from onadata.libs.utils.project_utils import set_project_perms_to_xform set_project_perms_to_xform(xform, instance.project) if hasattr(instance, 'has_external_choices') \ and instance.has_external_choices: instance.xls.seek(0) f = sheet_to_csv(instance.xls.read(), 'external_choices') f.seek(0, os.SEEK_END) size = f.tell() f.seek(0) from onadata.apps.main.models.meta_data import MetaData data_file = InMemoryUploadedFile( file=f, field_name='data_file', name='itemsets.csv', content_type='text/csv', size=size, charset=None ) MetaData.media_upload(xform, data_file)
def test_set_project_perms_to_xform(self): """ Test set_project_perms_to_xform(xform, project) """ self._publish_transportation_form() # Alice has data entry role to default project alice = self._create_user('alice', 'alice', create_profile=True) DataEntryRole.add(alice, self.project) set_project_perms_to_xform(self.xform, self.project) self.assertTrue(DataEntryRole.user_has_role(alice, self.xform)) self.assertTrue(self.project.pk, self.xform.project_id) # Create other project and transfer xform to new project project_b = Project(name='Project B', created_by=self.user, organization=self.user) project_b.save() self.xform.project = project_b self.xform.save() self.xform.refresh_from_db() self.assertTrue(self.project.pk, self.xform.project_id) # set permissions for new project set_project_perms_to_xform(self.xform, project_b) # Alice should have no data entry role to transfered form self.assertFalse(DataEntryRole.user_has_role(alice, self.xform))
def publish_project_xform(request, project): def set_form(): props = { 'project': project.pk, 'dropbox_xls_url': request.DATA.get('dropbox_xls_url'), 'xls_url': request.DATA.get('xls_url'), 'csv_url': request.DATA.get('csv_url') } form = QuickConverter(props, request.FILES) return form.publish(project.organization, created_by=request.user) xform = None if 'formid' in request.DATA: xform = get_object_or_404(XForm, pk=request.DATA.get('formid')) if not ManagerRole.user_has_role(request.user, xform): raise exceptions.PermissionDenied( _("{} has no manager/owner role to the form {}".format( request.user, xform))) xform.project = project xform.save() set_project_perms_to_xform(xform, project) else: xform = publish_form(set_form) return xform
def test_set_project_perms_to_xform(self): """ Test set_project_perms_to_xform(xform, project) """ self._publish_transportation_form() # Alice has data entry role to default project alice = self._create_user('alice', 'alice', create_profile=True) DataEntryRole.add(alice, self.project) set_project_perms_to_xform(self.xform, self.project) self.assertTrue(DataEntryRole.user_has_role(alice, self.xform)) self.assertTrue(self.project.pk, self.xform.project_id) # Create other project and transfer xform to new project project_b = Project( name='Project B', created_by=self.user, organization=self.user) project_b.save() self.xform.project = project_b self.xform.save() self.xform.refresh_from_db() self.assertTrue(self.project.pk, self.xform.project_id) # set permissions for new project set_project_perms_to_xform(self.xform, project_b) # Alice should have no data entry role to transfered form self.assertFalse(DataEntryRole.user_has_role(alice, self.xform))
def set_object_permissions(sender, instance=None, created=False, **kwargs): # seems the super is not called, have to get xform from here xform = XForm.objects.get(pk=instance.pk) if created: from onadata.libs.permissions import OwnerRole OwnerRole.add(instance.user, xform) if instance.created_by and instance.user != instance.created_by: OwnerRole.add(instance.created_by, xform) from onadata.libs.utils.project_utils import set_project_perms_to_xform set_project_perms_to_xform(xform, instance.project) if hasattr(instance, 'has_external_choices') \ and instance.has_external_choices: instance.xls.seek(0) f = sheet_to_csv(instance.xls.read(), 'external_choices') f.seek(0, os.SEEK_END) size = f.tell() f.seek(0) from onadata.apps.main.models.meta_data import MetaData data_file = InMemoryUploadedFile(file=f, field_name='data_file', name='itemsets.csv', content_type='text/csv', size=size, charset=None) MetaData.media_upload(xform, data_file)
def update_merged_xform(project, user): """Update ownership of MergedXforms.""" merged_xforms = MergedXForm.objects.filter( project=project, deleted_at__isnull=True) for form in merged_xforms: form.user = user form.created_by = user form.save() set_project_perms_to_xform(form, project)
def update_merged_xform(project, user): """Update ownership of MergedXforms.""" merged_xforms = MergedXForm.objects.filter(project=project, deleted_at__isnull=True) for form in merged_xforms: form.user = user form.created_by = user form.save() set_project_perms_to_xform(form, project)
def set_object_permissions(sender, instance=None, created=False, **kwargs): if created: from onadata.libs.permissions import OwnerRole OwnerRole.add(instance.user, instance) if instance.created_by and instance.user != instance.created_by: OwnerRole.add(instance.created_by, instance) from onadata.libs.utils.project_utils import set_project_perms_to_xform set_project_perms_to_xform(instance, instance.project)
def set_object_permissions(sender, instance=None, created=False, **kwargs): if created: OwnerRole.add(instance.user, instance) OwnerRole.add(instance.user, instance.xform_ptr) if instance.created_by and instance.user != instance.created_by: OwnerRole.add(instance.created_by, instance) OwnerRole.add(instance.created_by, instance.xform_ptr) set_project_perms_to_xform(instance, instance.project) set_project_perms_to_xform(instance.xform_ptr, instance.project)
def publish_project_xform(request, project): def set_form(): props = { 'project': project.pk, 'dropbox_xls_url': request.data.get('dropbox_xls_url'), 'xls_url': request.data.get('xls_url'), 'csv_url': request.data.get('csv_url'), 'text_xls_form': request.data.get('text_xls_form') } form = QuickConverter(props, request.FILES) return form.publish(project.organization, created_by=request.user) xform = None def id_string_exists_in_account(): try: XForm.objects.get( user=project.organization, id_string=xform.id_string) except XForm.DoesNotExist: return False return True if 'formid' in request.data: xform = get_object_or_404(XForm, pk=request.data.get('formid')) if not ManagerRole.user_has_role(request.user, xform): raise exceptions.PermissionDenied(_( "{} has no manager/owner role to the form {}". format( request.user, xform))) msg = 'Form with the same id_string already exists in this account' # Without this check, a user can't transfer a form to projects that # he/she owns because `id_string_exists_in_account` will always # return true if project.organization != xform.user and \ id_string_exists_in_account(): raise exceptions.ParseError(_(msg)) xform.user = project.organization xform.project = project try: with transaction.atomic(): xform.save() except IntegrityError: raise exceptions.ParseError(_(msg)) set_project_perms_to_xform(xform, project) else: xform = publish_form(set_form) return xform
def update_xform_with_new_user(self, project, user): """ Update XForm user update the DataViews and also set the permissions for the xForm and the project. """ xforms = XForm.objects.filter( project=project, deleted_at__isnull=True, downloadable=True) for form in xforms: form.user = user form.created_by = user form.save() self.update_data_views(form) set_project_perms_to_xform(form, project)
def update_xform_with_new_user(self, project, user): """ Update XForm user update the DataViews and also set the permissions for the xForm and the project. """ xforms = XForm.objects.filter(project=project, deleted_at__isnull=True, downloadable=True) for form in xforms: form.user = user form.created_by = user form.save() self.update_data_views(form) set_project_perms_to_xform(form, project)
def set_object_permissions(sender, instance=None, created=False, **kwargs): if created: from onadata.libs.permissions import OwnerRole OwnerRole.add(instance.user, instance) if instance.created_by and instance.user != instance.created_by: OwnerRole.add(instance.created_by, instance) from onadata.libs.utils.project_utils import set_project_perms_to_xform set_project_perms_to_xform(instance, instance.project) # clear cache safe_delete('{}{}'.format(PROJ_FORMS_CACHE, instance.project.pk)) safe_delete('{}{}'.format(IS_ORG, instance.pk))
def set_object_permissions(sender, instance=None, created=False, **kwargs): """ Apply the relevant object permissions for the form to all users who should have access to it. """ if instance.project: # clear cache safe_delete('{}{}'.format(PROJ_FORMS_CACHE, instance.project.pk)) safe_delete('{}{}'.format(PROJ_BASE_FORMS_CACHE, instance.project.pk)) # seems the super is not called, have to get xform from here xform = XForm.objects.get(pk=instance.pk) if created: from onadata.libs.permissions import OwnerRole OwnerRole.add(instance.user, xform) if instance.created_by and instance.user != instance.created_by: OwnerRole.add(instance.created_by, xform) from onadata.libs.utils.project_utils import set_project_perms_to_xform_async # noqa try: set_project_perms_to_xform_async.delay(xform.pk, instance.project.pk) except OperationalError: from onadata.libs.utils.project_utils import set_project_perms_to_xform # noqa set_project_perms_to_xform(xform, instance.project) if hasattr(instance, 'has_external_choices') \ and instance.has_external_choices: instance.xls.seek(0) f = sheet_to_csv(instance.xls.read(), 'external_choices') f.seek(0, os.SEEK_END) size = f.tell() f.seek(0) from onadata.apps.main.models.meta_data import MetaData data_file = InMemoryUploadedFile( file=f, field_name='data_file', name='itemsets.csv', content_type='text/csv', size=size, charset=None ) MetaData.media_upload(xform, data_file)
def publish_project_xform(request, project): def set_form(): form = QuickConverter({'project': project.pk}, request.FILES) return form.publish(project.organization, created_by=request.user) xform = None if 'formid' in request.DATA: xform = get_object_or_404(XForm, pk=request.DATA.get('formid')) xform.project = project xform.save() set_project_perms_to_xform(xform, project) else: xform = publish_form(set_form) return xform
def _reapply_perms(self, username=None, days=None, seconds=None): xforms = XForm.objects.none() the_past = None if username: xforms = XForm.objects.filter(user__username=username) else: if days: the_past = timezone.now() - timedelta(days=days) if seconds: the_past = timezone.now() - timedelta(seconds=seconds) if the_past: xforms = XForm.objects.filter( Q(date_created__gte=the_past) | Q(date_modified__gte=the_past)) self.stdout.write(_("{} to be updated").format(xforms.count())) with use_master: for xform in queryset_iterator(xforms): set_project_perms_to_xform(xform, xform.project) self.stdout.write(gc.collect())
def publish_project_xform(request, project): """ Publish XLSForm to a project given a request. """ def set_form(): """ Instantiates QuickConverter form to publish a form. """ props = { 'project': project.pk, 'dropbox_xls_url': request.data.get('dropbox_xls_url'), 'xls_url': request.data.get('xls_url'), 'csv_url': request.data.get('csv_url'), 'text_xls_form': request.data.get('text_xls_form') } form = QuickConverter(props, request.FILES) return form.publish(project.organization, created_by=request.user) xform = None def id_string_exists_in_account(): """ Checks if an id_string exists in an account, returns True if it exists otherwise returns False. """ try: XForm.objects.get(user=project.organization, id_string=xform.id_string) except XForm.DoesNotExist: return False return True if 'formid' in request.data: xform = get_object_or_404(XForm, pk=request.data.get('formid')) safe_delete('{}{}'.format(PROJ_FORMS_CACHE, xform.project.pk)) safe_delete('{}{}'.format(PROJ_BASE_FORMS_CACHE, xform.project.pk)) if not ManagerRole.user_has_role(request.user, xform): raise exceptions.PermissionDenied( _("{} has no manager/owner role to the form {}".format( request.user, xform))) msg = 'Form with the same id_string already exists in this account' # Without this check, a user can't transfer a form to projects that # he/she owns because `id_string_exists_in_account` will always # return true if project.organization != xform.user and \ id_string_exists_in_account(): raise exceptions.ParseError(_(msg)) xform.user = project.organization xform.project = project try: with transaction.atomic(): xform.save() except IntegrityError: raise exceptions.ParseError(_(msg)) else: # First assign permissions to the person who uploaded the form OwnerRole.add(request.user, xform) try: # Next run async task to apply all other perms set_project_perms_to_xform_async.delay(xform.pk, project.pk) except OperationalError: # Apply permissions synchrounously set_project_perms_to_xform(xform, project) else: xform = publish_form(set_form) return xform
def publish_project_xform(request, project): """ Publish XLSForm to a project given a request. """ def set_form(): """ Instantiates QuickConverter form to publish a form. """ props = { 'project': project.pk, 'dropbox_xls_url': request.data.get('dropbox_xls_url'), 'xls_url': request.data.get('xls_url'), 'csv_url': request.data.get('csv_url'), 'text_xls_form': request.data.get('text_xls_form') } form = QuickConverter(props, request.FILES) return form.publish(project.organization, created_by=request.user) xform = None def id_string_exists_in_account(): """ Checks if an id_string exists in an account, returns True if it exists otherwise returns False. """ try: XForm.objects.get( user=project.organization, id_string=xform.id_string) except XForm.DoesNotExist: return False return True if 'formid' in request.data: xform = get_object_or_404(XForm, pk=request.data.get('formid')) safe_delete('{}{}'.format(PROJ_FORMS_CACHE, xform.project.pk)) safe_delete('{}{}'.format(PROJ_BASE_FORMS_CACHE, xform.project.pk)) if not ManagerRole.user_has_role(request.user, xform): raise exceptions.PermissionDenied( _("{} has no manager/owner role to the form {}".format( request.user, xform))) msg = 'Form with the same id_string already exists in this account' # Without this check, a user can't transfer a form to projects that # he/she owns because `id_string_exists_in_account` will always # return true if project.organization != xform.user and \ id_string_exists_in_account(): raise exceptions.ParseError(_(msg)) xform.user = project.organization xform.project = project try: with transaction.atomic(): xform.save() except IntegrityError: raise exceptions.ParseError(_(msg)) else: # First assign permissions to the person who uploaded the form OwnerRole.add(request.user, xform) try: # Next run async task to apply all other perms set_project_perms_to_xform_async.delay(xform.pk, project.pk) except OperationalError: # Apply permissions synchrounously set_project_perms_to_xform(xform, project) else: xform = publish_form(set_form) return xform