def handle(self, *args, **options): try: xls_filepath = options['xls_filepath'] except KeyError: raise CommandError(_("You must provide the path to the xls file.")) # make sure path exists if not os.path.exists(xls_filepath): raise CommandError( _("The xls file '%s' does not exist.") % xls_filepath) try: username = options['username'] except KeyError: raise CommandError( _("You must provide the username to publish the form to.")) # make sure user exists try: user = User.objects.get(username=username) except User.DoesNotExist: raise CommandError(_("The user '%s' does not exist.") % username) # wasteful but we need to get the id_string beforehand survey = create_survey_from_xls(xls_filepath) # check if a form with this id_string exists for this user form_already_exists = XForm.objects.filter( user=user, id_string=survey.id_string).count() > 0 # id_string of form to replace, if any id_string = None if form_already_exists: if 'replace' in options and options['replace']: id_string = survey.id_string self.stdout.write(_("Form already exist, replacing ..\n")) else: raise CommandError( _("The form with id_string '%s' already exists, use the -r" " option to replace it.") % survey.id_string) else: self.stdout.write(_("Form does NOT exist, publishing ..\n")) try: project_name = options['project_name'] project = Project.objects.get(name=project_name) except (KeyError, Project.DoesNotExist): project = get_user_default_project(user) # publish xls_file = django_file(xls_filepath, 'xls_file', 'application/vnd.ms-excel') publish_xls_form(xls_file, user, project, id_string) self.stdout.write(_("Done..\n"))
def publish(self, user, id_string=None, created_by=None): if self.is_valid(): # If a text (csv) representation of the xlsform is present, # this will save the file and pass it instead of the 'xls_file' # field. if 'text_xls_form' in self.cleaned_data\ and self.cleaned_data['text_xls_form'].strip(): csv_data = self.cleaned_data['text_xls_form'] # assigning the filename to a random string (quick fix) import random rand_name = "uploaded_form_%s.csv" % ''.join( random.sample("abcdefghijklmnopqrstuvwxyz0123456789", 6)) cleaned_xls_file = \ default_storage.save( upload_to(None, rand_name, user.username), ContentFile(csv_data)) else: cleaned_xls_file = self.cleaned_data['xls_file'] if not cleaned_xls_file: cleaned_url = (self.cleaned_data['xls_url'].strip() or self.cleaned_data['dropbox_xls_url'] or self.cleaned_data['csv_url']) cleaned_xls_file = urlparse(cleaned_url) cleaned_xls_file = \ '_'.join(cleaned_xls_file.path.split('/')[-2:]) name, extension = os.path.splitext(cleaned_xls_file) if extension not in VALID_FILE_EXTENSIONS: r = requests.get(cleaned_url) if r.headers.get('content-type') in \ VALID_XLSFORM_CONTENT_TYPES and \ r.status_code < 400: cleaned_xls_file = get_filename(r) cleaned_xls_file = \ upload_to(None, cleaned_xls_file, user.username) self.validate(cleaned_url) xls_data = ContentFile(urllib2.urlopen(cleaned_url).read()) cleaned_xls_file = \ default_storage.save(cleaned_xls_file, xls_data) project = self.cleaned_data['project'] if project is None: project = get_user_default_project(user) else: project = self._project # publish the xls return publish_xls_form(cleaned_xls_file, user, project, id_string, created_by or user)
def publish(self, user, id_string=None): if self.is_valid(): # If a text (csv) representation of the xlsform is present, # this will save the file and pass it instead of the 'xls_file' # field. if 'text_xls_form' in self.cleaned_data\ and self.cleaned_data['text_xls_form'].strip(): csv_data = self.cleaned_data['text_xls_form'] # "Note that any text-based field - such as CharField or # EmailField - always cleans the input into a Unicode string" # (https://docs.djangoproject.com/en/1.8/ref/forms/api/#django.forms.Form.cleaned_data). csv_data = csv_data.encode('utf-8') # requires that csv forms have a settings with an id_string or # form_id _sheets = csv_to_dict(StringIO(csv_data)) try: _settings = _sheets['settings'][0] if 'id_string' in _settings: _name = '%s.csv' % _settings['id_string'] else: _name = '%s.csv' % _settings['form_id'] except (KeyError, IndexError) as e: raise ValueError('CSV XLSForms must have a settings sheet' ' and id_string or form_id') cleaned_xls_file = \ default_storage.save( upload_to(None, _name, user.username), ContentFile(csv_data)) else: cleaned_xls_file = self.cleaned_data['xls_file'] if not cleaned_xls_file: cleaned_url = self.cleaned_data['xls_url'] if cleaned_url.strip() == '': cleaned_url = self.cleaned_data['dropbox_xls_url'] cleaned_xls_file = urlparse(cleaned_url) cleaned_xls_file = \ '_'.join(cleaned_xls_file.path.split('/')[-2:]) if cleaned_xls_file[-4:] != '.xls': cleaned_xls_file += '.xls' cleaned_xls_file = \ upload_to(None, cleaned_xls_file, user.username) self.validate(cleaned_url) xls_data = ContentFile(urllib2.urlopen(cleaned_url).read()) cleaned_xls_file = \ default_storage.save(cleaned_xls_file, xls_data) # publish the xls return publish_xls_form(cleaned_xls_file, user, id_string)
def publish(self, user, id_string=None): if self.is_valid(): # If a text (csv) representation of the xlsform is present, # this will save the file and pass it instead of the 'xls_file' # field. if 'text_xls_form' in self.cleaned_data\ and self.cleaned_data['text_xls_form'].strip(): csv_data = self.cleaned_data['text_xls_form'] # "Note that any text-based field - such as CharField or # EmailField - always cleans the input into a Unicode string" # (https://docs.djangoproject.com/en/1.8/ref/forms/api/#django.forms.Form.cleaned_data). csv_data = csv_data.encode('utf-8') # requires that csv forms have a settings with an id_string or # form_id _sheets = csv_to_dict(StringIO(csv_data)) try: _settings = _sheets['settings'][0] if 'id_string' in _settings: _name = '%s.csv' % _settings['id_string'] else: _name = '%s.csv' % _settings['form_id'] except (KeyError, IndexError) as e: raise ValueError('CSV XLSForms must have a settings sheet' ' and id_string or form_id') cleaned_xls_file = \ default_storage.save( upload_to(None, _name, user.username), ContentFile(csv_data)) else: cleaned_xls_file = self.cleaned_data['xls_file'] if not cleaned_xls_file: cleaned_url = self.cleaned_data['xls_url'] if cleaned_url.strip() == u'': cleaned_url = self.cleaned_data['dropbox_xls_url'] cleaned_xls_file = urlparse(cleaned_url) cleaned_xls_file = \ '_'.join(cleaned_xls_file.path.split('/')[-2:]) if cleaned_xls_file[-4:] != '.xls': cleaned_xls_file += '.xls' cleaned_xls_file = \ upload_to(None, cleaned_xls_file, user.username) self.validate(cleaned_url) xls_data = ContentFile(urllib2.urlopen(cleaned_url).read()) cleaned_xls_file = \ default_storage.save(cleaned_xls_file, xls_data) # publish the xls return publish_xls_form(cleaned_xls_file, user, id_string)
def publish(self, user, id_string=None, created_by=None): if self.is_valid(): # If a text (csv) representation of the xlsform is present, # this will save the file and pass it instead of the 'xls_file' # field. if 'text_xls_form' in self.cleaned_data\ and self.cleaned_data['text_xls_form'].strip(): csv_data = self.cleaned_data['text_xls_form'] # assigning the filename to a random string (quick fix) import random rand_name = "uploaded_form_%s.csv" % ''.join( random.sample("abcdefghijklmnopqrstuvwxyz0123456789", 6)) cleaned_xls_file = \ default_storage.save( upload_to(None, rand_name, user.username), ContentFile(csv_data)) else: cleaned_xls_file = self.cleaned_data['xls_file'] if not cleaned_xls_file: cleaned_url = self.cleaned_data['xls_url'] if cleaned_url.strip() == u'': cleaned_url = self.cleaned_data['dropbox_xls_url'] cleaned_xls_file = urlparse(cleaned_url) cleaned_xls_file = \ '_'.join(cleaned_xls_file.path.split('/')[-2:]) if cleaned_xls_file[-4:] != '.xls': cleaned_xls_file += '.xls' cleaned_xls_file = \ upload_to(None, cleaned_xls_file, user.username) self.validate(cleaned_url) xls_data = ContentFile(urllib2.urlopen(cleaned_url).read()) cleaned_xls_file = \ default_storage.save(cleaned_xls_file, xls_data) project = self.cleaned_data['project'] if project is None: project = get_user_default_project(user) else: project = self._project # publish the xls return publish_xls_form(cleaned_xls_file, user, project, id_string, created_by or user)
def publish(self, user, id_string=None, created_by=None): if self.is_valid(): # If a text (csv) representation of the xlsform is present, # this will save the file and pass it instead of the 'xls_file' # field. if "text_xls_form" in self.cleaned_data and self.cleaned_data["text_xls_form"].strip(): csv_data = self.cleaned_data["text_xls_form"] # assigning the filename to a random string (quick fix) import random rand_name = "uploaded_form_%s.csv" % "".join(random.sample("abcdefghijklmnopqrstuvwxyz0123456789", 6)) cleaned_xls_file = default_storage.save( upload_to(None, rand_name, user.username), ContentFile(csv_data) ) else: cleaned_xls_file = self.cleaned_data["xls_file"] if not cleaned_xls_file: cleaned_url = ( self.cleaned_data["xls_url"].strip() or self.cleaned_data["dropbox_xls_url"] or self.cleaned_data["csv_url"] ) cleaned_xls_file = urlparse(cleaned_url) cleaned_xls_file = "_".join(cleaned_xls_file.path.split("/")[-2:]) name, extension = os.path.splitext(cleaned_xls_file) if extension not in [".xls", ".xlsx", ".csv"]: cleaned_xls_file += ".xls" cleaned_xls_file = upload_to(None, cleaned_xls_file, user.username) self.validate(cleaned_url) xls_data = ContentFile(urllib2.urlopen(cleaned_url).read()) cleaned_xls_file = default_storage.save(cleaned_xls_file, xls_data) project = self.cleaned_data["project"] if project is None: project = get_user_default_project(user) else: project = self._project # publish the xls return publish_xls_form(cleaned_xls_file, user, project, id_string, created_by or user)
def publish(self, user, id_string=None, created_by=None): """ Publish XLSForm. """ if self.is_valid(): # If a text (csv) representation of the xlsform is present, # this will save the file and pass it instead of the 'xls_file' # field. cleaned_xls_file = None if 'text_xls_form' in self.cleaned_data\ and self.cleaned_data['text_xls_form'].strip(): csv_data = self.cleaned_data['text_xls_form'] # assigning the filename to a random string (quick fix) import random rand_name = "uploaded_form_%s.csv" % ''.join( random.sample("abcdefghijklmnopqrstuvwxyz0123456789", 6)) cleaned_xls_file = \ default_storage.save( upload_to(None, rand_name, user.username), ContentFile(csv_data.encode())) if 'xls_file' in self.cleaned_data and\ self.cleaned_data['xls_file']: cleaned_xls_file = self.cleaned_data['xls_file'] if 'floip_file' in self.cleaned_data and\ self.cleaned_data['floip_file']: cleaned_xls_file = self.cleaned_data['floip_file'] cleaned_url = ( self.cleaned_data['xls_url'].strip() or self.cleaned_data['dropbox_xls_url'] or self.cleaned_data['csv_url']) if cleaned_url: cleaned_xls_file = urlparse(cleaned_url) cleaned_xls_file = \ '_'.join(cleaned_xls_file.path.split('/')[-2:]) name, extension = os.path.splitext(cleaned_xls_file) if extension not in VALID_FILE_EXTENSIONS and name: response = requests.get(cleaned_url) if response.headers.get('content-type') in \ VALID_XLSFORM_CONTENT_TYPES and \ response.status_code < 400: cleaned_xls_file = get_filename(response) cleaned_xls_file = \ upload_to(None, cleaned_xls_file, user.username) self.validate(cleaned_url) xls_data = ContentFile(urlopen(cleaned_url).read()) cleaned_xls_file = \ default_storage.save(cleaned_xls_file, xls_data) project = self.cleaned_data['project'] if project is None: project = get_user_default_project(user) else: project = self._project cleaned_xml_file = self.cleaned_data['xml_file'] if cleaned_xml_file: return publish_xml_form(cleaned_xml_file, user, project, id_string, created_by or user) if cleaned_xls_file is None: raise forms.ValidationError( _(u"XLSForm not provided, expecting either of these" " params: 'xml_file', 'xls_file', 'xls_url', 'csv_url'," " 'dropbox_xls_url', 'text_xls_form', 'floip_file'")) # publish the xls return publish_xls_form(cleaned_xls_file, user, project, id_string, created_by or user)
def publish(self, user, id_string=None): if self.is_valid(): cleaned_xls_file = self.cleaned_data['xls_file'] # publish the xls return publish_xls_form(cleaned_xls_file, user, id_string)
def publish(self, user, id_string=None, created_by=None): """ Publish XLSForm. """ if self.is_valid(): # If a text (csv) representation of the xlsform is present, # this will save the file and pass it instead of the 'xls_file' # field. cleaned_xls_file = None if 'text_xls_form' in self.cleaned_data\ and self.cleaned_data['text_xls_form'].strip(): csv_data = self.cleaned_data['text_xls_form'] # assigning the filename to a random string (quick fix) import random rand_name = "uploaded_form_%s.csv" % ''.join( random.sample("abcdefghijklmnopqrstuvwxyz0123456789", 6)) cleaned_xls_file = \ default_storage.save( upload_to(None, rand_name, user.username), ContentFile(csv_data.encode())) if 'xls_file' in self.cleaned_data and\ self.cleaned_data['xls_file']: cleaned_xls_file = self.cleaned_data['xls_file'] if 'floip_file' in self.cleaned_data and\ self.cleaned_data['floip_file']: cleaned_xls_file = self.cleaned_data['floip_file'] cleaned_url = (self.cleaned_data['xls_url'].strip() or self.cleaned_data['dropbox_xls_url'] or self.cleaned_data['csv_url']) if cleaned_url: cleaned_xls_file = urlparse(cleaned_url) cleaned_xls_file = \ '_'.join(cleaned_xls_file.path.split('/')[-2:]) name, extension = os.path.splitext(cleaned_xls_file) if extension not in VALID_FILE_EXTENSIONS and name: response = requests.get(cleaned_url) if response.headers.get('content-type') in \ VALID_XLSFORM_CONTENT_TYPES and \ response.status_code < 400: cleaned_xls_file = get_filename(response) cleaned_xls_file = \ upload_to(None, cleaned_xls_file, user.username) self.validate(cleaned_url) xls_data = ContentFile(urlopen(cleaned_url).read()) cleaned_xls_file = \ default_storage.save(cleaned_xls_file, xls_data) project = self.cleaned_data['project'] if project is None: project = get_user_default_project(user) else: project = self._project cleaned_xml_file = self.cleaned_data['xml_file'] if cleaned_xml_file: return publish_xml_form(cleaned_xml_file, user, project, id_string, created_by or user) if cleaned_xls_file is None: raise forms.ValidationError( _(u"XLSForm not provided, expecting either of these" " params: 'xml_file', 'xls_file', 'xls_url', 'csv_url'," " 'dropbox_xls_url', 'text_xls_form', 'floip_file'")) # publish the xls return publish_xls_form(cleaned_xls_file, user, project, id_string, created_by or user)