← Back to team overview

schooltool-developers team mailing list archive

Re: Photo instance

 

On 02/16/2012 02:53 AM, Douglas Cerna wrote:
Gentlemen:

I've implemented most of the functionality Justas and I discussed during the sprint for the photo work:

* Use of blobs for storing the images (using zope.file's File objects)

* Data converter that accepts only image mime types (JPEG, PNG, GIF and BMP). If you try to upload a PDF, you should get a validation error. The converter also resizes the image, using 99px for maximum width or 128 for maximum height. This is the ratio of the passport photo. Of course, we can modify these values to store larger images, I just chose those because it's the area of the image in the person index view

* The person index view adapts the general information table width if there's a photo, so the photo doesn't overlap the table

* There's a new @@photo view on person objects that returns the image data setting the appropriate headers, such as content type and length. It also sets a If-Modified-Since header according to the last time the person object was modified. This allows the browser to use its cache instead of requesting the image on every request

* The edit person view allows the user to delete the existing image or upload a new one

  Nice!

You can see it in action:

http://69.164.203.135:6662/persons/douglas (vertical JPEG)
http://69.164.203.135:6662/persons/camila (horizontal PNG)
http://69.164.203.135:6662/persons/teacher001 (GIF)
http://69.164.203.135:6662/persons/teacher002 (BMP)

  Very nice :)

The branch is at:

lp:~replaceafill/schooltool/flourish_photos

I'd appreciate your feedback on functionality and code issues.

  PhotoView.__call___: # XXX: what to do if photo is None? redirect?
  - Maybe throw NotFound?

We should get rid of PhotoDataConverter.getImageInfo, and use image.size() and image.format instead.

  Nitpicking
- do not hide defaults like DESIRED_SIZE inside methods. Make those class attributes or something. - PhotoFieldFormAdapter: it's slightly nicer to use object.__setattr__ instead of self.__dict__['foo'] = bar -- that said, I failed to do this in many many places. - image.save(f, image.format.upper(), **kw). Is there a point of doing .upper() there?

flourish.css: "border-radius: 4px;". Is it worth adding -moz-border-radius?.. Maybe not anymore.

  May be worth considering:

    - store all images as PNG.
- convert all images to RGB or RGBA mode. Paletted (GIF) -> convert to RGB -> pretty scaling with resampling and all. - do not accept large data. No 1GB image transforms to thumbnails killing the server. - do not accept large images. No 10000x10000 px image transforms - it's a photo, not a map of Washington D.C. - save image.copy() (after the thumbnail transform) to keep only raster data. Do we really need app headers like image comments, GPS coordinates and other waste?
    - scale images up, if they're smaller than desired size?
    - when editing person info, it would be nice to see the current photo.

  Well, that's my two cents.

Nice work!
Justas



Follow ups

References