Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

from builtins import object 

# Copyright 2010-2015 Luc Saffre 

# License: BSD (see file COPYING for details) 

 

import logging 

logger = logging.getLogger(__name__) 

 

from django.utils.translation import ugettext_lazy as _ 

from django.db import models 

 

from lino.core.model import Model 

 

 

class Uploadable(Model): 

    """Represents an uploadable file. 

 

    .. attribute:: file 

 

        Pointer to the file itself (a `Django FileField 

        <https://docs.djangoproject.com/en/1.8/ref/models/fields/#filefield>`_). 

 

    .. attribute:: mimetype 

 

        The `Media type <https://en.wikipedia.org/wiki/Media_type>`_ 

        of the file.  See also `this thread 

        <http://stackoverflow.com/questions/643690/maximum-mimetype-length-when-storing-type-in-db>`_ 

        about length of MIME type field. 

 

    """ 

 

    # file_field_class = models.FileField 

 

    class Meta(object): 

        abstract = True 

        # verbose_name = _("upload") 

        # verbose_name_plural = _("uploads") 

 

    file = models.FileField( 

        _("File"), 

        blank=True, 

        upload_to='uploads/%Y/%m') 

    mimetype = models.CharField( 

        _("MIME type"), 

        blank=True, max_length=255, editable=False) 

 

    def handle_uploaded_files(self, request): 

        #~ from django.core.files.base import ContentFile 

        if not 'file' in request.FILES: 

            logger.debug("No 'file' has been submitted.") 

            return 

        uf = request.FILES['file']  # an UploadedFile instance 

        #~ cf = ContentFile(request.FILES['file'].read()) 

        #~ print f 

        #~ raise NotImplementedError 

        #~ dir,name = os.path.split(f.name) 

        #~ if name != f.name: 

            #~ print "Aha: %r contains a path! (%s)" % (f.name,__file__) 

 

        self.size = uf.size 

        self.mimetype = uf.content_type 

 

        """ 

        Certain Python versions or systems don't manage non-ascii filenames, 

        so we replace any non-ascii char by "_" 

        """ 

 

        #~ logger.info('20121004 handle_uploaded_files() %r',uf.name) 

        name = uf.name.encode('ascii', 'replace') 

        name = name.replace('?', '_') 

 

        # Django magics: 

        self.file = name  # assign a string 

        ff = self.file  # get back a FileField instance ! 

        #~ print 'uf=',repr(uf),'ff=',repr(ff) 

 

        #~ if not ispure(uf.name): 

            #~ raise Exception('uf.name is a %s!' % type(uf.name)) 

 

        ff.save(name, uf, save=False) 

 

        # The expression `self.file` 

        # now yields a FieldFile instance that has been created from `uf`. 

        # see Django FileDescriptor.__get__() 

 

        logger.info("Wrote uploaded file %s", ff.path)