Ticket #20810: 0001-Fix-PIL-bug-when-using-EPS-file-in-ImageField.patch

File 0001-Fix-PIL-bug-when-using-EPS-file-in-ImageField.patch, 20.6 KB (added by imatusov, 11 years ago)
  • django/core/files/images.py

    From fae6275f6a70b28ceeffa9640c3bb4009fd88a7c Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Izidor=20Matu=C5=A1ov?= <izidor.matusov@tangentsnowball.com>
    Date: Fri, 26 Jul 2013 16:05:35 +0100
    Subject: [PATCH] Fix PIL bug when using EPS file in ImageField
    
    PIL supports reading EPS files by converting them into a bitmap which is
    then processed, see [1]. get_image_dimensions() from django.core.files.images
    uses PILs API which fails on loading an EPS file.
    
    This patch adds failback mode when in case of IOError, PIL standard
    method is used. A test case of using EPS file for ImageField and sample
    image from [2] was added.
    
    1: http://pillow.readthedocs.org/en/latest/_modules/PIL/EpsImagePlugin.html
    2: http://people.sc.fsu.edu/~jburkardt/data/eps/eps.html
    ---
     django/core/files/images.py           |    8 +
     tests/model_fields/mathematica.eps    | 1473 +++++++++++++++++++++++++++++++++
     tests/model_fields/test_imagefield.py |   20 +
     3 files changed, 1501 insertions(+)
     create mode 100644 tests/model_fields/mathematica.eps
    
    diff --git a/django/core/files/images.py b/django/core/files/images.py
    index e1d6091..7ec9c01 100644
    a b Utility functions for handling images.  
    33
    44Requires Pillow (or PIL), as you might imagine.
    55"""
     6from PIL import Image as PILImage
    67import zlib
    78
    89from django.core.files import File
    def get_image_dimensions(file_or_path, close=False):  
    6768                return p.image.size
    6869            chunk_size = chunk_size*2
    6970        return None
     71    except IOError as e:
     72        # If PIL failes to detect image dimensions, fallback and try to
     73        # open it as an standard image. Images like EPS are not recognized
     74        # by _imaging C decoder but recognize by plugin system.
     75        file.seek(0)
     76        image = PILImage.open(file)
     77        return image.size
    7078    finally:
    7179        if close:
    7280            file.close()
  • new file tests/model_fields/mathematica.eps

    diff --git a/tests/model_fields/mathematica.eps b/tests/model_fields/mathematica.eps
    new file mode 100644
    index 0000000..4b39791
    - +  
     1%!PS-Adobe-2.0 EPSF-1.2
     2%%BoundingBox: 0 0 288 177
     3%%HiResBoundingBox: 0 0 288 177.938
     4%%Creator: (Mathematica Macintosh 3.0)
     5%%Title: Clipboard
     6%%CreationDate: (Monday, September 11, 2000) (2:45:40 PM)
     7%%DocumentNeededResources: (atend)
     8%%DocumentFonts: (atend)
     9%%DocumentNeededFonts: (atend)
     10%%EndComments
     11
     12% Source: http://people.sc.fsu.edu/~jburkardt/data/eps/eps.html
     13% Distributed under GNU LGPL license
     14%
     15gsave
     16150 dict begin
     17/Mfixwid true def
     18/Mrot 0 def
     19/Mpstart {
     20    MathPictureStart
     21} bind def
     22/Mpend {
     23    MathPictureEnd
     24} bind def
     25/Mscale {
     26    0 1 0 1
     27    5 -1 roll
     28    MathScale
     29} bind def
     30/Plain  /Courier findfont def
     31/Bold   /Courier-Bold findfont def
     32/Italic /Courier-Oblique findfont def
     33/MathPictureStart {
     34        /Mimatrix
     35         matrix currentmatrix
     36        def
     37        gsave
     38        newpath
     39        Mleft
     40        Mbottom
     41        translate
     42        /Mtmatrix
     43        matrix currentmatrix
     44        def
     45        Plain
     46        Mfontsize scalefont
     47        setfont
     48        0 setgray
     49        0 setlinewidth
     50} bind def
     51/MathPictureEnd {
     52        grestore
     53} bind def
     54/MathSubStart {
     55             Momatrix
     56        Mgmatrix Mtmatrix
     57        Mleft Mbottom
     58        Mwidth Mheight
     59        9 -2 roll
     60        moveto
     61        Mtmatrix setmatrix
     62        currentpoint
     63        Mgmatrix setmatrix
     64        11 -2 roll
     65        moveto
     66        Mtmatrix setmatrix
     67        currentpoint
     68        2 copy translate
     69        /Mtmatrix matrix currentmatrix def
     70        /Mleft 0 def
     71        /Mbottom 0 def
     72        3 -1 roll
     73        exch sub
     74        /Mheight exch def
     75        sub
     76        /Mwidth exch def
     77} bind def
     78/MathSubEnd {
     79        /Mheight exch def
     80        /Mwidth exch def
     81        /Mbottom exch def
     82        /Mleft exch def
     83        /Mtmatrix exch def
     84        dup setmatrix
     85        /Mgmatrix exch def
     86              /Momatrix exch def
     87} bind def
     88/Mdot {
     89        moveto
     90        0 0 rlineto
     91        stroke
     92} bind def
     93/Mtetra {
     94        moveto
     95        lineto
     96        lineto
     97        lineto
     98        fill
     99} bind def
     100/Metetra {
     101        moveto
     102        lineto
     103        lineto
     104        lineto
     105        closepath
     106        gsave
     107        fill
     108        grestore
     109        0 setgray
     110        stroke
     111} bind def
     112/Mistroke {
     113        flattenpath
     114        0 0 0
     115        {
     116        4 2 roll
     117        pop pop
     118        }
     119        {
     120        4 -1 roll
     121        2 index
     122        sub dup mul
     123        4 -1 roll
     124        2 index
     125        sub dup mul
     126        add sqrt
     127        4 -1 roll
     128        add
     129        3 1 roll
     130        }
     131        {
     132        stop
     133        }
     134        {
     135        stop
     136        }
     137        pathforall
     138        pop pop
     139        currentpoint
     140        stroke
     141        moveto
     142        currentdash
     143        3 -1 roll
     144        add
     145        setdash
     146} bind def
     147/Mfstroke {
     148        stroke
     149        currentdash
     150        pop 0
     151        setdash
     152} bind def
     153/Mrotsboxa {
     154        gsave
     155        dup
     156        /Mrot
     157        exch def
     158        Mrotcheck
     159        Mtmatrix
     160        dup
     161        setmatrix
     162        7 1 roll
     163        4 index
     164        4 index
     165        translate
     166        rotate
     167        3 index
     168        -1 mul
     169        3 index
     170        -1 mul
     171        translate
     172        /Mtmatrix
     173        matrix
     174        currentmatrix
     175        def
     176        grestore
     177        Msboxa
     178        3  -1 roll
     179        /Mtmatrix
     180        exch def
     181        /Mrot
     182        0 def
     183} bind def
     184/Msboxa {
     185        newpath
     186        5 -1 roll
     187        Mvboxa
     188        pop
     189        Mboxout
     190        6 -1 roll
     191        5 -1 roll
     192        4 -1 roll
     193        Msboxa1
     194        5 -3 roll
     195        Msboxa1
     196        Mboxrot
     197        [
     198        7 -2 roll
     199        2 copy
     200        [
     201        3 1 roll
     202        10 -1 roll
     203        9 -1 roll
     204        ]
     205        6 1 roll
     206        5 -2 roll
     207        ]
     208} bind def
     209/Msboxa1 {
     210        sub
     211        2 div
     212        dup
     213        2 index
     214        1 add
     215        mul
     216        3 -1 roll
     217        -1 add
     218        3 -1 roll
     219        mul
     220} bind def
     221/Mvboxa {
     222        Mfixwid
     223        {
     224        Mvboxa1
     225        }
     226        {
     227        dup
     228        Mwidthcal
     229        0 exch
     230        {
     231        add
     232        }
     233        forall
     234        exch
     235        Mvboxa1
     236        4 index
     237        7 -1 roll
     238        add
     239        4 -1 roll
     240        pop
     241        3 1 roll
     242        }
     243        ifelse
     244} bind def
     245/Mvboxa1 {
     246        gsave
     247        newpath
     248        [ true
     249        3 -1 roll
     250        {
     251        Mbbox
     252        5 -1 roll
     253        {
     254        0
     255        5 1 roll
     256        }
     257        {
     258        7 -1 roll
     259        exch sub
     260        (m) stringwidth pop
     261        .3 mul
     262        sub
     263        7 1 roll
     264        6 -1 roll
     265        4 -1 roll
     266        Mmin
     267        3 -1 roll
     268        5 index
     269        add
     270        5 -1 roll
     271        4 -1 roll
     272        Mmax
     273        4 -1 roll
     274        }
     275        ifelse
     276        false
     277        }
     278        forall
     279        { stop } if
     280        counttomark
     281        1 add
     282        4 roll
     283        ]
     284        grestore
     285} bind def
     286/Mbbox {
     287        0 0 moveto
     288        false charpath
     289        flattenpath
     290        pathbbox
     291        newpath
     292} bind def
     293/Mmin {
     294        2 copy
     295        gt
     296        { exch } if
     297        pop
     298} bind def
     299/Mmax {
     300        2 copy
     301        lt
     302        { exch } if
     303        pop
     304} bind def
     305/Mrotshowa {
     306        dup
     307        /Mrot
     308        exch def
     309        Mrotcheck
     310        Mtmatrix
     311        dup
     312        setmatrix
     313        7 1 roll
     314        4 index
     315        4 index
     316        translate
     317        rotate
     318        3 index
     319        -1 mul
     320        3 index
     321        -1 mul
     322        translate
     323        /Mtmatrix
     324        matrix
     325        currentmatrix
     326        def
     327        Mgmatrix setmatrix
     328        Mshowa
     329        /Mtmatrix
     330        exch def
     331        /Mrot 0 def
     332} bind def
     333/Mshowa {
     334        4 -2 roll
     335        moveto
     336        2 index
     337        Mtmatrix setmatrix
     338        Mvboxa
     339        7 1 roll
     340        Mboxout
     341        6 -1 roll
     342        5 -1 roll
     343        4 -1 roll
     344        Mshowa1
     345        4 1 roll
     346        Mshowa1
     347        rmoveto
     348        currentpoint
     349        Mfixwid
     350        {
     351        Mshowax
     352        }
     353        {
     354        Mshoway
     355        }
     356        ifelse
     357        pop pop pop pop
     358        Mgmatrix setmatrix
     359} bind def
     360/Mshowax {
     361        0 1
     362        4 index length
     363        -1 add
     364        {
     365        2 index
     366        4 index
     367        2 index
     368        get
     369        3 index
     370        add
     371        moveto
     372        4 index
     373        exch get
     374        show
     375        } for
     376} bind def
     377/Mshoway {
     378        3 index
     379        Mwidthcal
     380        5 1 roll
     381        0 1
     382        4 index length
     383        -1 add
     384        {
     385        2 index
     386        4 index
     387        2 index
     388        get
     389        3 index
     390        add
     391        moveto
     392        4 index
     393        exch get
     394        [
     395        6 index
     396        aload
     397        length
     398        2 add
     399        -1 roll
     400        {
     401        pop
     402        Strform
     403        stringwidth
     404        pop
     405        neg
     406        exch
     407        add
     408        0 rmoveto
     409        }
     410        exch
     411        kshow
     412        cleartomark
     413        } for
     414        pop
     415} bind def
     416/Mwidthcal {
     417        [
     418        exch
     419        {
     420        Mwidthcal1
     421        }
     422        forall
     423        ]
     424        [
     425        exch
     426        dup
     427        Maxlen
     428        -1 add
     429        0 1
     430        3 -1 roll
     431        {
     432        [
     433        exch
     434        2 index
     435        {
     436        1 index
     437        Mget
     438        exch
     439        }
     440        forall
     441        pop
     442        Maxget
     443        exch
     444        }
     445        for
     446        pop
     447        ]
     448        Mreva
     449} bind def
     450/Mreva  {
     451        [
     452        exch
     453        aload
     454        length
     455        -1 1
     456        {1 roll}
     457        for
     458        ]
     459} bind def
     460/Mget   {
     461        1 index
     462        length
     463        -1 add
     464        1 index
     465        ge
     466        {
     467        get
     468        }
     469        {
     470        pop pop
     471        0
     472        }
     473        ifelse
     474} bind def
     475/Maxlen {
     476        [
     477        exch
     478        {
     479        length
     480        }
     481        forall
     482        Maxget
     483} bind def
     484/Maxget {
     485        counttomark
     486        -1 add
     487        1 1
     488        3 -1 roll
     489        {
     490        pop
     491        Mmax
     492        }
     493        for
     494        exch
     495        pop
     496} bind def
     497/Mwidthcal1 {
     498        [
     499        exch
     500        {
     501        Strform
     502        stringwidth
     503        pop
     504        }
     505        forall
     506        ]
     507} bind def
     508/Strform {
     509        /tem (x) def
     510        tem 0
     511        3 -1 roll
     512        put
     513        tem
     514} bind def
     515/Mshowa1 {
     516        2 copy
     517        add
     518        4 1 roll
     519        sub
     520        mul
     521        sub
     522        -2 div
     523} bind def
     524/MathScale {
     525        Mwidth
     526        Mheight
     527        Mlp
     528        translate
     529        scale
     530        /yscale exch def
     531        /ybias exch def
     532        /xscale exch def
     533        /xbias exch def
     534        /Momatrix
     535        xscale yscale matrix scale
     536        xbias ybias matrix translate
     537        matrix concatmatrix def
     538        /Mgmatrix
     539        matrix currentmatrix
     540        def
     541} bind def
     542/Mlp {
     543        3 copy
     544        Mlpfirst
     545        {
     546        Mnodistort
     547        {
     548        Mmin
     549        dup
     550        } if
     551        4 index
     552        2 index
     553        2 index
     554        Mlprun
     555        11 index
     556        11 -1 roll
     557        10 -4 roll
     558        Mlp1
     559        8 index
     560        9 -5 roll
     561        Mlp1
     562        4 -1 roll
     563        and
     564        { exit } if
     565        3 -1 roll
     566        pop pop
     567        } loop
     568        exch
     569        3 1 roll
     570        7 -3 roll
     571        pop pop pop
     572} bind def
     573/Mlpfirst {
     574        3 -1 roll
     575        dup length
     576        2 copy
     577        -2 add
     578        get
     579        aload
     580        pop pop pop
     581        4 -2 roll
     582        -1 add
     583        get
     584        aload
     585        pop pop pop
     586        6 -1 roll
     587        3 -1 roll
     588        5 -1 roll
     589        sub
     590        dup /MsaveAx exch def
     591        div
     592        4 1 roll
     593        exch sub
     594        dup /MsaveAy exch def
     595        div
     596} bind def
     597/Mlprun {
     598        2 copy
     599        4 index
     600        0 get
     601        dup
     602        4 1 roll
     603        Mlprun1
     604        3 copy
     605        8 -2 roll
     606        9 -1 roll
     607        {
     608        3 copy
     609        Mlprun1
     610        3 copy
     611        11 -3 roll
     612        /gt Mlpminmax
     613        8 3 roll
     614        11 -3 roll
     615        /lt Mlpminmax
     616        8 3 roll
     617        } forall
     618        pop pop pop pop
     619        3 1 roll
     620        pop pop
     621        aload pop
     622        5 -1 roll
     623        aload pop
     624        exch
     625        6 -1 roll
     626        Mlprun2
     627        8 2 roll
     628        4 -1 roll
     629        Mlprun2
     630        6 2 roll
     631        3 -1 roll
     632        Mlprun2
     633        4 2 roll
     634        exch
     635        Mlprun2
     636        6 2 roll
     637} bind def
     638/Mlprun1 {
     639        aload pop
     640        exch
     641        6 -1 roll
     642        5 -1 roll
     643        mul add
     644        4 -2 roll
     645        mul
     646        3 -1 roll
     647        add
     648} bind def
     649/Mlprun2 {
     650        2 copy
     651        add 2 div
     652        3 1 roll
     653        exch sub
     654} bind def
     655/Mlpminmax {
     656        cvx
     657        2 index
     658        6 index
     659        2 index
     660        exec
     661        {
     662        7 -3 roll
     663        4 -1 roll
     664        } if
     665        1 index
     666        5 index
     667        3 -1 roll
     668        exec
     669        {
     670        4 1 roll
     671        pop
     672        5 -1 roll
     673        aload
     674        pop pop
     675        4 -1 roll
     676        aload pop
     677        [
     678        8 -2 roll
     679        pop
     680        5 -2 roll
     681        pop
     682        6 -2 roll
     683        pop
     684        5 -1 roll
     685        ]
     686        4 1 roll
     687        pop
     688        }
     689        {
     690        pop pop pop
     691        } ifelse
     692} bind def
     693/Mlp1 {
     694        5 index
     695        3 index sub
     696        5 index
     697        2 index mul
     698        1 index
     699        le
     700        1 index
     701        0 le
     702        or
     703        dup
     704        not
     705        {
     706        1 index
     707        3 index div
     708        .99999 mul
     709        8 -1 roll
     710        pop
     711        7 1 roll
     712        }
     713        if
     714        8 -1 roll
     715        2 div
     716        7 -2 roll
     717        pop sub
     718        5 index
     719        6 -3 roll
     720        pop pop
     721        mul sub
     722        exch
     723} bind def
     724/intop 0 def
     725/inrht 0 def
     726/inflag 0 def
     727/outflag 0 def
     728/xadrht 0 def
     729/xadlft 0 def
     730/yadtop 0 def
     731/yadbot 0 def
     732/Minner {
     733        outflag
     734        1
     735        eq
     736        {
     737        /outflag 0 def
     738        /intop 0 def
     739        /inrht 0 def
     740        } if
     741        5 index
     742        gsave
     743        Mtmatrix setmatrix
     744        Mvboxa pop
     745        grestore
     746        3 -1 roll
     747        pop
     748        dup
     749        intop
     750        gt
     751        {
     752        /intop
     753        exch def
     754        }
     755        { pop }
     756        ifelse
     757        dup
     758        inrht
     759        gt
     760        {
     761        /inrht
     762        exch def
     763        }
     764        { pop }
     765        ifelse
     766        pop
     767        /inflag
     768        1 def
     769} bind def
     770/Mouter {
     771        /xadrht 0 def
     772        /xadlft 0 def
     773        /yadtop 0 def
     774        /yadbot 0 def
     775        inflag
     776        1 eq
     777        {
     778        dup
     779        0 lt
     780        {
     781        dup
     782        intop
     783        mul
     784        neg
     785        /yadtop
     786        exch def
     787        } if
     788        dup
     789        0 gt
     790        {
     791        dup
     792        intop
     793        mul
     794        /yadbot
     795        exch def
     796        }
     797        if
     798        pop
     799        dup
     800        0 lt
     801        {
     802        dup
     803        inrht
     804        mul
     805        neg
     806        /xadrht
     807        exch def
     808        } if
     809        dup
     810        0 gt
     811        {
     812        dup
     813        inrht
     814        mul
     815        /xadlft
     816        exch def
     817        } if
     818        pop
     819        /outflag 1 def
     820        }
     821        { pop pop}
     822        ifelse
     823        /inflag 0 def
     824        /inrht 0 def
     825        /intop 0 def
     826} bind def
     827/Mboxout {
     828        outflag
     829        1
     830        eq
     831        {
     832        4 -1
     833        roll
     834        xadlft
     835        leadjust
     836        add
     837        sub
     838        4 1 roll
     839        3 -1
     840        roll
     841        yadbot
     842        leadjust
     843        add
     844        sub
     845        3 1
     846        roll
     847        exch
     848        xadrht
     849        leadjust
     850        add
     851        add
     852        exch
     853        yadtop
     854        leadjust
     855        add
     856        add
     857        /outflag 0 def
     858        /xadlft 0 def
     859        /yadbot 0 def
     860        /xadrht 0 def
     861        /yadtop 0 def
     862        } if
     863} bind def
     864/leadjust {
     865        (m) stringwidth pop
     866        .5 mul
     867} bind def
     868/Mrotcheck {
     869        dup
     870        90
     871        eq
     872        {
     873        yadbot
     874        /yadbot
     875        xadrht
     876        def
     877        /xadrht
     878        yadtop
     879        def
     880        /yadtop
     881        xadlft
     882        def
     883        /xadlft
     884        exch
     885        def
     886        }
     887        if
     888        dup
     889        cos
     890        1 index
     891        sin
     892        Checkaux
     893        dup
     894        cos
     895        1 index
     896        sin neg
     897        exch
     898        Checkaux
     899        3 1 roll
     900        pop pop
     901} bind def
     902/Checkaux {
     903        4 index
     904        exch
     905        4 index
     906        mul
     907        3 1 roll
     908        mul add
     909        4 1 roll
     910} bind def
     911/Mboxrot {
     912        Mrot
     913        90 eq
     914        {
     915        brotaux
     916        4 2
     917        roll
     918        }
     919        if
     920        Mrot
     921        180 eq
     922        {
     923        4 2
     924        roll
     925        brotaux
     926        4 2
     927        roll
     928        brotaux
     929        }
     930        if
     931        Mrot
     932        270 eq
     933        {
     934        4 2
     935        roll
     936        brotaux
     937        }
     938        if
     939} bind def
     940/brotaux {
     941        neg
     942        exch
     943        neg
     944} bind def
     945/Mabsproc {
     946        0
     947        matrix defaultmatrix
     948        dtransform idtransform
     949        dup mul exch
     950        dup mul
     951        add sqrt
     952} bind def
     953/Mabswid {
     954        Mabsproc
     955        setlinewidth
     956} bind def
     957/Mabsdash {
     958        exch
     959        [
     960        exch
     961        {
     962        Mabsproc
     963        }
     964        forall
     965        ]
     966        exch
     967        setdash
     968} bind def
     969/MBeginOrig { Momatrix concat} bind def
     970/MEndOrig { Mgmatrix setmatrix} bind def
     971/sampledsound where
     972{ pop}
     973{ /sampledsound {
     974exch
     975pop
     976exch
     9775 1 roll
     978mul
     9794 idiv
     980mul
     9812 idiv
     982exch pop
     983exch
     984/Mtempproc exch def
     985{ Mtempproc pop }
     986repeat
     987} bind def
     988} ifelse
     989% Here are the short operators
     990/g { setgray} bind def
     991/k { setcmykcolor} bind def
     992/m { moveto} bind def
     993/p { gsave} bind def
     994/r { setrgbcolor} bind def
     995/w { setlinewidth} bind def
     996/C { curveto} bind def
     997/F { fill} bind def
     998/L { lineto} bind def
     999/P { grestore} bind def
     1000/s { stroke} bind def
     1001
     1002/MFill {
     1003        0 0             moveto
     1004        Mwidth 0        lineto
     1005        Mwidth Mheight  lineto
     1006        0 Mheight       lineto
     1007        fill
     1008} bind def
     1009
     1010/MPlotRegion {
     1011        3 index
     1012        Mwidth mul
     1013        2 index
     1014        Mheight mul
     1015        translate
     1016        exch sub
     1017        Mheight mul
     1018        /Mheight
     1019        exch def
     1020        exch sub
     1021        Mwidth mul
     1022        /Mwidth
     1023        exch def
     1024} bind def
     1025
     1026/Mcharproc
     1027{
     1028        currentfile
     1029        (x)
     1030        readhexstring
     1031        pop
     1032        0 get
     1033        exch
     1034        div
     1035} bind def
     1036
     1037/Mshadeproc
     1038{
     1039        dup
     1040        3 1
     1041        roll
     1042        {
     1043        dup
     1044        Mcharproc
     1045        3 1
     1046        roll
     1047        } repeat
     1048        1 eq
     1049        {
     1050        setgray
     1051        }
     1052        {
     1053        3 eq
     1054        {
     1055        setrgbcolor
     1056        }
     1057        {
     1058        setcmykcolor
     1059        } ifelse
     1060        } ifelse
     1061} bind def
     1062
     1063/Mrectproc
     1064{
     1065        3 index
     1066        2 index
     1067        moveto
     1068        2 index
     1069        3 -1
     1070        roll
     1071        lineto
     1072        dup
     1073        3 1
     1074        roll
     1075        lineto
     1076        lineto
     1077        fill
     1078} bind def
     1079
     1080/Mcolorimage
     1081{
     1082        7 1
     1083        roll
     1084        pop
     1085        pop
     1086        matrix
     1087        invertmatrix
     1088        concat
     1089        2 exch exp
     1090        1 sub
     1091        3 1 roll
     1092        1 1
     1093        2 index
     1094        {
     1095        1 1
     1096        4 index
     1097        {
     1098        dup
     1099        1 sub
     1100        exch
     1101        2 index
     1102        dup
     1103        1 sub
     1104        exch
     1105        7 index
     1106        9 index
     1107        Mshadeproc
     1108        Mrectproc
     1109        } for
     1110        pop
     1111        } for
     1112        pop pop pop pop
     1113} bind def
     1114
     1115/Mimage
     1116{
     1117        pop
     1118        matrix
     1119        invertmatrix
     1120        concat
     1121        2 exch exp
     1122        1 sub
     1123        3 1 roll
     1124        1 1
     1125        2 index
     1126        {
     1127        1 1
     1128        4 index
     1129        {
     1130        dup
     1131        1 sub
     1132        exch
     1133        2 index
     1134        dup
     1135        1 sub
     1136        exch
     1137        7 index
     1138        Mcharproc
     1139        setgray
     1140        Mrectproc
     1141        } for
     1142        pop
     1143        } for
     1144        pop pop pop
     1145} bind def
     1146/Mnodistort true def
     1147/colorimage where
     1148{ pop /Mcolorimage {colorimage} bind def /Mimage {image} bind def}
     1149{
     1150/colorimage {Mcolorimage} bind def
     1151} ifelse
     11521.000000 1.000000 scale
     11530.000000 -177.937500 translate
     11541.000000 -1.000000 scale
     1155-0.000000 -0.000000 translate
     1156/Mleft          0.000000 def
     1157/Mbottom        0.000000 def
     1158/Mwidth         288.000000 def
     1159/Mheight        177.937500 def
     11600 setgray
     11610 setlinewidth
     1162/Courier findfont 12 scalefont setfont
     1163/Mfontsize 12 def
     1164/Plain /Courier findfont def
     1165
     11660 Mbottom Mheight neg add 2 mul Mheight add translate
     11671 -1 scale
     1168%!
     1169%%Creator: Mathematica
     1170%%AspectRatio: .61803
     1171MathPictureStart
     1172/Mabs {
     1173Mgmatrix idtransform
     1174Mtmatrix dtransform
     1175} bind def
     1176/Mabsadd { Mabs
     11773 -1 roll add
     11783 1 roll add
     1179exch } bind def
     1180%% Graphics
     1181/Courier findfont 10  scalefont  setfont
     1182% Scaling calculations
     11830.0238095 0.0952381 0.309015 0.294306 [
     1184[.21429 .29651 -3 -9 ]
     1185[.21429 .29651 3 0 ]
     1186[.40476 .29651 -3 -9 ]
     1187[.40476 .29651 3 0 ]
     1188[.59524 .29651 -3 -9 ]
     1189[.59524 .29651 3 0 ]
     1190[.78571 .29651 -3 -9 ]
     1191[.78571 .29651 3 0 ]
     1192[.97619 .29651 -6 -9 ]
     1193[.97619 .29651 6 0 ]
     1194[.01131 .01471 -12 -4.5 ]
     1195[.01131 .01471 0 4.5 ]
     1196[.01131 .16186 -24 -4.5 ]
     1197[.01131 .16186 0 4.5 ]
     1198[.01131 .45617 -18 -4.5 ]
     1199[.01131 .45617 0 4.5 ]
     1200[.01131 .60332 -6 -4.5 ]
     1201[.01131 .60332 0 4.5 ]
     1202[ 0 0 0 0 ]
     1203[ 1 .61803 0 0 ]
     1204] MathScale
     1205% Start of Graphics
     12061 setlinecap
     12071 setlinejoin
     1208newpath
     12090 g
     1210.25 Mabswid
     1211[ ] 0 setdash
     1212.21429 .30901 m
     1213.21429 .31526 L
     1214s
     1215[(2)] .21429 .29651 0 1 Mshowa
     1216.40476 .30901 m
     1217.40476 .31526 L
     1218s
     1219[(4)] .40476 .29651 0 1 Mshowa
     1220.59524 .30901 m
     1221.59524 .31526 L
     1222s
     1223[(6)] .59524 .29651 0 1 Mshowa
     1224.78571 .30901 m
     1225.78571 .31526 L
     1226s
     1227[(8)] .78571 .29651 0 1 Mshowa
     1228.97619 .30901 m
     1229.97619 .31526 L
     1230s
     1231[(10)] .97619 .29651 0 1 Mshowa
     1232.125 Mabswid
     1233.07143 .30901 m
     1234.07143 .31276 L
     1235s
     1236.11905 .30901 m
     1237.11905 .31276 L
     1238s
     1239.16667 .30901 m
     1240.16667 .31276 L
     1241s
     1242.2619 .30901 m
     1243.2619 .31276 L
     1244s
     1245.30952 .30901 m
     1246.30952 .31276 L
     1247s
     1248.35714 .30901 m
     1249.35714 .31276 L
     1250s
     1251.45238 .30901 m
     1252.45238 .31276 L
     1253s
     1254.5 .30901 m
     1255.5 .31276 L
     1256s
     1257.54762 .30901 m
     1258.54762 .31276 L
     1259s
     1260.64286 .30901 m
     1261.64286 .31276 L
     1262s
     1263.69048 .30901 m
     1264.69048 .31276 L
     1265s
     1266.7381 .30901 m
     1267.7381 .31276 L
     1268s
     1269.83333 .30901 m
     1270.83333 .31276 L
     1271s
     1272.88095 .30901 m
     1273.88095 .31276 L
     1274s
     1275.92857 .30901 m
     1276.92857 .31276 L
     1277s
     1278.25 Mabswid
     12790 .30901 m
     12801 .30901 L
     1281s
     1282.02381 .01471 m
     1283.03006 .01471 L
     1284s
     1285[(-1)] .01131 .01471 1 0 Mshowa
     1286.02381 .16186 m
     1287.03006 .16186 L
     1288s
     1289[(-0.5)] .01131 .16186 1 0 Mshowa
     1290.02381 .45617 m
     1291.03006 .45617 L
     1292s
     1293[(0.5)] .01131 .45617 1 0 Mshowa
     1294.02381 .60332 m
     1295.03006 .60332 L
     1296s
     1297[(1)] .01131 .60332 1 0 Mshowa
     1298.125 Mabswid
     1299.02381 .04414 m
     1300.02756 .04414 L
     1301s
     1302.02381 .07357 m
     1303.02756 .07357 L
     1304s
     1305.02381 .103 m
     1306.02756 .103 L
     1307s
     1308.02381 .13243 m
     1309.02756 .13243 L
     1310s
     1311.02381 .19129 m
     1312.02756 .19129 L
     1313s
     1314.02381 .22072 m
     1315.02756 .22072 L
     1316s
     1317.02381 .25015 m
     1318.02756 .25015 L
     1319s
     1320.02381 .27958 m
     1321.02756 .27958 L
     1322s
     1323.02381 .33845 m
     1324.02756 .33845 L
     1325s
     1326.02381 .36788 m
     1327.02756 .36788 L
     1328s
     1329.02381 .39731 m
     1330.02756 .39731 L
     1331s
     1332.02381 .42674 m
     1333.02756 .42674 L
     1334s
     1335.02381 .4856 m
     1336.02756 .4856 L
     1337s
     1338.02381 .51503 m
     1339.02756 .51503 L
     1340s
     1341.02381 .54446 m
     1342.02756 .54446 L
     1343s
     1344.02381 .57389 m
     1345.02756 .57389 L
     1346s
     1347.25 Mabswid
     1348.02381 0 m
     1349.02381 .61803 L
     1350s
     13510 0 m
     13521 0 L
     13531 .61803 L
     13540 .61803 L
     1355closepath
     1356clip
     1357newpath
     1358.5 Mabswid
     1359.02381 .30902 m
     1360.06244 .42516 L
     1361.08255 .47925 L
     1362.10458 .52975 L
     1363.11448 .54875 L
     1364.12507 .56621 L
     1365.13499 .5797 L
     1366.14415 .58954 L
     1367.14901 .59372 L
     1368.15437 .59746 L
     1369.15975 .6003 L
     1370.1627 .60146 L
     1371.16546 .6023 L
     1372.1667 .60259 L
     1373.16805 .60286 L
     1374.16934 .60305 L
     1375.17052 .60319 L
     1376.1717 .60327 L
     1377.17277 .60331 L
     1378.174 .60332 L
     1379.17516 .60327 L
     1380.17643 .60317 L
     1381.17707 .6031 L
     1382.17777 .60301 L
     1383.18017 .60258 L
     1384.18153 .60225 L
     1385.18298 .60184 L
     1386.1856 .60091 L
     1387.19088 .59838 L
     1388.19577 .59525 L
     1389.20684 .58538 L
     1390.21659 .57358 L
     1391.22696 .55801 L
     1392.26471 .47813 L
     1393.30491 .3646 L
     1394.3436 .24588 L
     1395.38474 .13133 L
     1396.40527 .08527 L
     1397.41527 .06645 L
     1398.42436 .05167 L
     1399.4332 .03954 L
     1400.44279 .02902 L
     1401.44806 .02443 L
     1402.45291 .02098 L
     1403.45756 .01838 L
     1404.46247 .01637 L
     1405.465 .01565 L
     1406.46625 .01537 L
     1407.4674 .01515 L
     1408.46853 .01498 L
     1409Mistroke
     1410.46956 .01486 L
     1411.4707 .01477 L
     1412.47191 .01472 L
     1413.47322 .01472 L
     1414.47442 .01476 L
     1415.47574 .01487 L
     1416.4764 .01494 L
     1417.47713 .01504 L
     1418.47836 .01525 L
     1419.47968 .01552 L
     1420.48205 .01615 L
     1421.48441 .01696 L
     1422.48697 .01805 L
     1423.49163 .02056 L
     1424.50036 .02711 L
     1425.50978 .03685 L
     1426.52017 .05066 L
     1427.54119 .08778 L
     1428.58145 .18687 L
     1429.62019 .30277 L
     1430.66138 .42668 L
     1431.68195 .48175 L
     1432.70106 .52578 L
     1433.71952 .56007 L
     1434.72977 .57512 L
     1435.73922 .58626 L
     1436.74949 .59527 L
     1437.75489 .59869 L
     1438.75765 .60007 L
     1439.7606 .60129 L
     1440.7632 .60212 L
     1441.76557 .60269 L
     1442.76671 .6029 L
     1443.76795 .60308 L
     1444.76913 .6032 L
     1445.77021 .60328 L
     1446.77147 .60332 L
     1447.77264 .60331 L
     1448.77393 .60325 L
     1449.77466 .60319 L
     1450.77533 .60312 L
     1451.77659 .60295 L
     1452.77798 .6027 L
     1453.78077 .60202 L
     1454.7833 .60118 L
     1455.78604 .60004 L
     1456.79103 .59735 L
     1457.80035 .5902 L
     1458.81125 .57845 L
     1459.8213 .56447 L
     1460Mistroke
     1461.84004 .53097 L
     1462.86067 .48425 L
     1463.90097 .37167 L
     1464.93977 .25263 L
     1465.97619 .14891 L
     1466Mfstroke
     1467% End of Graphics
     1468MathPictureEnd
     1469%%PSTrailer
     1470end
     1471grestore
     1472showpage
     1473%%EPS Trailer
  • tests/model_fields/test_imagefield.py

    diff --git a/tests/model_fields/test_imagefield.py b/tests/model_fields/test_imagefield.py
    index f6019bd..6cf7748 100644
    a b class ImageFieldTestMixin(object):  
    5454        file_path2 = os.path.join(os.path.dirname(upath(__file__)), "8x4.png")
    5555        self.file2 = self.File(open(file_path2, 'rb'))
    5656
     57        eps_file_path = os.path.join(os.path.dirname(upath(__file__)),
     58                                     "mathematica.eps")
     59        self.eps_file = self.File(open(eps_file_path, 'rb'))
     60
    5761    def tearDown(self):
    5862        """
    5963        Removes temp directory and all its contents.
    class TwoImageFieldTests(ImageFieldTestMixin, TestCase):  
    436440        # Dimensions were recalculated, and hence file should have opened.
    437441        self.assertEqual(p.mugshot.was_opened, True)
    438442        self.assertEqual(p.headshot.was_opened, True)
     443
     444
     445@skipIf(Image is None, "PIL is required to test ImageField")
     446class ImageFieldEPSTests(ImageFieldTestMixin, TestCase):
     447    """
     448    Test EPS support of ImageField
     449    """
     450
     451    PersonModel = Person
     452    EPS_WIDTH, EPS_HEIGHT = 288, 177
     453
     454    def test_constructor(self):
     455        p = self.PersonModel(mugshot=self.eps_file)
     456        self.check_dimensions(p, self.EPS_WIDTH, self.EPS_HEIGHT, 'mugshot')
     457        p.save()
     458        self.check_dimensions(p, self.EPS_WIDTH, self.EPS_HEIGHT, 'mugshot')
Back to Top