It's hard to explain what i meant what is happend to trigger the error. Fell
free to ask if something is unclear...
All following is related to widelands.org, not to the alpha-sites.
Fact is:
1. All images which was uploaded in year 2009 have the faulty path
(".../django_projects/widelands/media//wlimages...")
2. All images which where uploaded in 2010 and afterwards have the right path
(".../django_projects/wlwebsite/code/widelands//media//wlimages...")
Note the additonal "wlwebsite/code" part on images uploaded in 2010 and
afterwards.
I assume that the website has changed the destination on the server somewhen in
this period. On the admin site (
https://wl.widelands.org/admin/wlimages/image/?all= ) we see the last image
upload in 2009 is on May 28, 2009. The next image upload was on Jan. 18, 2010.
The one in 2009 contains the wrong path, the latter one contains the right
path. So somewhen inbetween this period (May 28, 2009 and Jan. 18, 2010) the
destination change of the website path was made.
How does the destination change affect the images? This is all made in function
create_and_save_image() in our ImageManger
http://bazaar.launchpad.net/~widelands-dev/widelands-website/trunk/view/head:/wlimages/models.py#L33
The "wrong" thing is happend here:
> path = "%swlimages/%s" % (MEDIA_ROOT,image.name)
> url = "%swlimages/%s" % (MEDIA_URL,image.name)
>
> destination = open(path,"wb")
> for chunk in image.chunks():
> destination.write(chunk)
>
> im.image = path
> im.url = url
Especially the forlast line is faulty. The "path" contains the absolute path to
the image including the image filename. So for images uploaded in 2009 it is
something like this:
/var/www/django_projects/widelands/media//wlimages/Saledus.png
For files which are uploaded in 2010 and afterwards it looks like this:
/var/www/django_projects/wlwebsite/code/widelands//media//wlimages/SuperMan.png
In the above line "im.image = path" the image is of type FileField which is
restricted to 100 chars and has only one required argument "upload_to=". See
https://docs.djangoproject.com/en/1.3/ref/models/fields/#django.db.models.ImageField
Our model do only use the "upload_to" argument and do not provides fields for
the height_field and width_field. To obtain these values (also the filesize) we
have to use the fileobject instead. See
https://docs.djangoproject.com/en/1.3/ref/files/file/
The File class has some usefull attributes like "name" and "size". The
ImageFile class have the additional attributes "width" and "height".
So, what happend if we try to obtain the width, height or size of an image by
editing an wikiarticle? Django trys to get the fileobject and checks if the
path is valid (this is made in
/lib/python2.7/site-packages/django/core/files/storage.py and
/lib/python2.7/site-packages/django/utils/_os.py function safe_join() ) The
related values for images uploaded in 2009 are:
In /lib/python2.7/site-packages/django/core/files/storage.py funtion path():
self.location = The current location
("/var/www/django_projects/wlwebsite/code/widelands//media/")
name = The name of the file relative(!) to MEDIA_ROOT (currently stored with
"im.image = path" as absolute(!) path to the image. For above example it is
"/var/www/django_projects/widelands/media//wlimages/Saledus.png")
In /lib/python2.7/site-packages/django/utils/_os.py function safe_join():
base_path = "/var/www/django_projects/wlwebsite/code/widelands/media/" (
self.location )
final_path = "/var/www/django_projects/widelands/media//wlimages/Saledus.png"
Because the final_path do not startswith base_path the value error is triggerd
and we see the "SuspiciousOperation" error.
To get rid of the error, we have to do:
1. Change the code which stores the filename
from:
im.image = path
to:
im.image = "wlimages/%s" % (name)
This will correct future uploads to the website. To correct the past Image
entries, we have to do step 2:
2. Change the entries for field "image" in the database table wlimages. On my
local copy this could be simple done. I dont know of this usecase could be used
on the server too. For my local installation i could do:
2.a. get a dumpdata for table wlimages:
> ./manage.py dumpdata --indent=2 > wlimages.json (The indent-option is only
> for convenience )
2.b. Change all(!) values for field "image" in the dumpdata:
from (f.e.):
"image": "/var/www/django_projects/widelands/media//wlimages/Saledus.png"
to:
"image": "wlimages/Saledus.png"
In words: Delete all chars before "wlimages/image.extension" including the
leading slash(es) before "wlimages"
2.c. Reload the edited table "wlimages.json" into the database:
> ./manage.py loaddata wlimages.json
The output should be like "Installed X object(s) from X fixture(s)" where X is
the number of datasets.
Thats all. If you reactivate alpha.widelands.org (currently i get a 502 "Bad
Gateway" error) we could maybe test this over there?
At last: Changing the value for field "image" as explained, will also correct
an error on the admin page: if you open
https://wl.widelands.org/admin/wlimages/image/166/ and click on the link in the
right of "Image", a "Page not found" error occurs. With my modifications a
click on that link will present the image.
Hopefully i didn't confuse you again...
A different question: I couldn't update this branch because i get allways a
"diverged" hint. What is the way to update this branch?
--
https://code.launchpad.net/~franku/widelands-website/handle_big_images/+merge/247235
Your team Widelands Developers is subscribed to branch lp:widelands-website.
_______________________________________________
Mailing list: https://launchpad.net/~widelands-dev
Post to : [email protected]
Unsubscribe : https://launchpad.net/~widelands-dev
More help : https://help.launchpad.net/ListHelp