. , . .
!
, gwt.
eclipse 3.6 java.
GWT.
gwt eclipse.
File > New > Web Application Project.
: genre
package: ru.musicmans
- Debug As > Web Application.
, . .
GWT Designer.
quick start.
, gwt plugin (gwt plugin , gwt) gwt java project, ( - convert to) :

ru.musicmans.genre.GenreTree:

, . genre.java Design.

? rpc call gwt, django. ?
. : javascript object, , , ( , ).
REST ( ). SmartGWT, . GWT REST,
Restlet Framework, django -
django-piston.
Restlet Framework, Edition for Google Web Toolkit. ( java build path ).
Django-Piston . django-piston -
. , :
>c:\Python26\Scripts\pip.exe install hg+http://bitbucket.org/jespern/django-piston@c4b2d21db51a#egg=piston
. api, (r'^api/', include('api.urls')), urls.py. urls.py handlers.py. , __init__.py .
handlers.py:
from django.core.urlresolvers import reverse
from piston.handler import BaseHandler#@UnresolvedImport
from genre.models import GenreDirStyle#@UnresolvedImport
class GenreHandler(BaseHandler):
allowed_methods = ('GET', )
fields = ('name', 'type', 'url' )
model = GenreDirStyle
@classmethod
def url(self, genre):
return reverse('genre_genre', args=[genre.id])
def read(self, request, genre_id):
genre = GenreDirStyle.objects.get(id=int(genre_id))
return genre
urls.py:
from django.conf.urls.defaults import *
from piston.resource import Resource#@UnresolvedImport
from api.handlers import GenreHandler#@UnresolvedImport
genre_resource = Resource(handler=GenreHandler)
urlpatterns = patterns('',
url(r'^genre/(?P[^/]+)/$', genre_resource, name='api_genre_id'),
)
, http://localhost:8000/api/genre/3/ :
{
"url": "/genre/id/4/",
"type": 3,
"name": "Prog-Rock"
}
application/json firefox,
,
RESTClient Firefox.
. widget gwt tree:


, , logLevel .
firebug , http://localhost:8000/api/genre/3 ,
SOP.
django-crossdomainxhr-middleware.py,
( firefox > 3.5).

.
, SOP . Jetty , , 8000.

war www\media\static\gwt\genre, windows, , :
www\media\static\gwt>mklink /d genre d:\path\to\gwt\war\
, ( - django) http://localhost:8000/media/static/gwt/genre/GenreTree.html?gwt.codesvr=127.0.0.1:9997 . gwt.codesvr gwt .
django, gwt . div id='genreTreeEntryPointId' , gwt root panel :
RootPanel rootPanel = RootPanel.get("genreTreeEntryPointId");
gwt "" django-, , http://localhost:8000/genre/tree/?gwt.codesvr=127.0.0.1:9997&genre_id=2 .
, :
- ( ). ( , ):
treeqs = GenreDirStyle.objects.raw("""SELECT t2.*
FROM genre_genredirstyle AS t1
LEFT JOIN genre_genredirstyle AS t2
ON t2.lft BETWEEN t1.lft AND t1.rgt
WHERE t1.lft < %s AND t1.rgt > %s AND t1.tree_id = 1 AND t2.depth-1 = t1.depth AND t2.tree_id = %s
ORDER BY t2.lft;""", (genre.lft, genre.rgt, genre.tree_id))
.
- div , , , ajax .
- JSON javascript, gwt :
private final Dictionary paramsDict = Dictionary.getDictionary("gwtGenreParameters");
String paramsDict.get("API_GENRES_MAIN_URL");
- JSON .
.
: google-gin totoe ( ).
- ( ):
private class GenreTreeItemData
{
private int id;
private Boolean alreadyLoaded = false;
private String description;
}
setUserObject(Object).
- , gwt gwt standart. , , css, ( body). ,
, standard.css gwt\standard\ ( ).
- API from piston.doc import documentation_view.
:

ps.
Aptana 3.0, Django PyDev ( , ctrl+space IDE, ?).