Exemple #1
0
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)
Exemple #2
0
    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()
Exemple #3
0
    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
Exemple #4
0
    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()
Exemple #5
0
 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()