class Allegato(ConMarcaTemporale, ConScadenzaPulizia, ModelloSemplice): """ Rappresenta un allegato generico in database, con potenziale scadenza. """ class Meta: verbose_name_plural = "Allegati" permissions = (("view_allegato", "Can view allegato"), ) oggetto_tipo = models.ForeignKey(ContentType, db_index=True, blank=True, null=True, related_name="allegato_come_oggetto", on_delete=models.SET_NULL) oggetto_id = models.PositiveIntegerField(db_index=True, blank=True, null=True) oggetto = GenericForeignKey('oggetto_tipo', 'oggetto_id') file = models.FileField("File", upload_to=GeneratoreNomeFile('allegati/'), validators=[valida_dimensione_file_10mb]) nome = models.CharField("Nome file", max_length=255, default="File", blank=False, null=False) @property def download_url(self): """ Ritorna l'URL per il download del file. """ return self.file.url def prepara_cartelle(self, file_path, path_include_file=True): """ Crea ricorsivamente le directory per la creazione di un file. Se path_include_file non specificato o True, il primo parametro aspettato e' il path completo al nuovo file. Altrimenti, solo il percorso da creare e' aspettato. """ if path_include_file: path = os.path.dirname(file_path) else: path = file_path if os.path.isdir(path): return True try: os.makedirs(path) except OSError as e: if e.errno == 17: # Dir already exists. No biggie. pass return True def delete(self, *args, **kwargs): self.file.delete() super(Allegato, self).delete(*args, **kwargs)
def genera_e_salva(self, nome='File.xlsx', scadenza=None, ordina_fogli=True, **kwargs): """ Genera il file e lo salva su database. :param nome: Il nome del file da allegare (opzionale, default 'File.xlsx'). :param scadenza: Scadenza del file. Domani. :param kwargs: :return: """ scadenza = scadenza or domani() generatore = GeneratoreNomeFile('allegati/') zname = generatore(self, nome) self.prepara_cartelle(MEDIA_ROOT + zname) workbook = xlsxwriter.Workbook(MEDIA_ROOT + zname) bold = workbook.add_format({'bold': True}) for foglio in [x for x in self.fogli]: # Per ogni foglio # Aggiunge il foglio worksheet = workbook.add_worksheet(foglio.nome) # Aggiunge l'intestazione for col, testo in enumerate(foglio.intestazione): worksheet.write(0, col, str(testo), bold) # Aggiunge il contenuto for riga, colonne in enumerate(foglio.contenuto): riga += 1 # Indice shiftato per intestazione for colonna, testo in enumerate(colonne): if isinstance(testo, datetime): testo = testo.strftime("%d/%m/%Y %H:%M") if isinstance(testo, date): testo = testo.strftime("%d/%m/%Y") if testo == ", ": # Rimuove campi ', ' testo = "" worksheet.write(riga, colonna, str(testo)) if ordina_fogli: workbook.worksheets_objs.sort(key=lambda x: x.name) workbook.close() self.file = zname self.nome = nome self.scadenza = scadenza self.save()
def comprimi(self, nome='Archivio.zip'): """ Salva il file compresso su disco e svuota la coda. Necessario salvare su database per persistere le modifiche. :param nome: :return: """ generatore = GeneratoreNomeFile('allegati/') zname = generatore(self, nome) self.prepara_cartelle(MEDIA_ROOT + zname) with ZipFile(MEDIA_ROOT + zname, 'w') as zf: for f_path, f_nome in self._file_in_attesa: zf.write(f_path, f_nome) zf.close() self.file = zname
def genera_e_salva(self, nome='File.pdf', scadenza=None, corpo={}, modello='pdf_vuoto.html', orientamento=ORIENTAMENTO_VERTICALE, formato=FORMATO_A4, posizione='allegati/'): """ Genera un file PDF con i parametri specificati e salva. :param nome: Il nome del file PDF da salvare. :param scadenza: La scadenza del file PDF. :param corpo: Dizionario per popolare il template del corpo. :param modello: Il modello del file PDF. :param orientamento: PDF.ORIENTAMENTO_VERTICALE o PDF.ORIENTAMENTO_VERTICALE. :param formato: PDF.FORMATO_A4 o niente. :param posizione: Cartella dove salvare il file. Default allegati/. :return: """ scadenza = scadenza or domani() url = DOMPDF_ENDPOINT corpo.update({"timestamp": datetime.now()}) html = get_template(modello).render(corpo) values = {'paper': formato, 'orientation': orientamento, 'html': html} data = urllib.parse.urlencode(values) data = data.encode('UTF-8') req = urllib.request.Request(url, data) response = urllib.request.urlopen(req) generatore = GeneratoreNomeFile(posizione) zname = generatore(self, nome) self.prepara_cartelle(MEDIA_ROOT + zname) pdffile = open(MEDIA_ROOT + zname, 'wb') pdffile.write(response.read()) pdffile.close() self.file = zname self.nome = nome self.scadenza = scadenza self.save()
def genera_e_salva(self, codice, nome="Immagine.png", scadenza=None): generatore = GeneratoreNomeFile('allegati/') zname = generatore(self, nome) self.prepara_cartelle(MEDIA_ROOT + zname) pngfile = open(MEDIA_ROOT + zname, 'wb') writer = ImageWriter() writer.dpi = 400 generate("EAN13", codice, writer=writer, output=pngfile, writer_options={ "quiet_zone": 0.5, "text_distance": 0.5, "module_height": 5.5, "font_size": 13, }) pngfile.close() scadenza = scadenza or domani() self.file = zname self.nome = nome self.scadenza = scadenza self.save()