maposmatic-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Maposmatic-dev] [PATCH 1/6] Revamp the jobs and maps pages


From: Maxime Petazzoni
Subject: [Maposmatic-dev] [PATCH 1/6] Revamp the jobs and maps pages
Date: Thu, 7 Jan 2010 13:07:39 +0100

This is a major revamp of the user experience on the jobs and maps
listing pages, and job detailled view page.

Jobs and rendered maps are no longer displayed in a table that could
easily overflow small screens. A list of jobs is used instead, with
nice, visual information on its status.

An automatic 5s refresh was also added to the individual job status page
when the job is not completed.
---
 www/maposmatic/models.py                 |   22 +++--
 www/maposmatic/templatetags/extratags.py |    5 +-
 www/maposmatic/views.py                  |    6 +-
 www/media/job-done.png                   |  Bin 0 -> 8912 bytes
 www/media/job-error.png                  |  Bin 0 -> 5264 bytes
 www/media/job-in-progress.png            |  Bin 0 -> 10329 bytes
 www/media/job-in-queue.png               |  Bin 0 -> 11457 bytes
 www/media/style.css                      |  100 +++++++++++++++------
 www/templates/maposmatic/all_jobs.html   |   52 +----------
 www/templates/maposmatic/all_maps.html   |   43 +--------
 www/templates/maposmatic/job-page.html   |   58 ++++++++++++
 www/templates/maposmatic/job.html        |  146 ++++++++----------------------
 www/templates/maposmatic/map.html        |   55 +++++++++++
 13 files changed, 249 insertions(+), 238 deletions(-)
 create mode 100644 www/media/job-done.png
 create mode 100644 www/media/job-error.png
 create mode 100644 www/media/job-in-progress.png
 create mode 100644 www/media/job-in-queue.png
 create mode 100644 www/templates/maposmatic/job-page.html
 create mode 100644 www/templates/maposmatic/map.html

diff --git a/www/maposmatic/models.py b/www/maposmatic/models.py
index 34cde89..dc3b3ce 100644
--- a/www/maposmatic/models.py
+++ b/www/maposmatic/models.py
@@ -137,20 +137,24 @@ class MapRenderingJob(models.Model):
         return os.path.join(www.settings.RENDERING_RESULT_PATH, 
self.files_prefix() + "_index." + format)
 
     def output_files(self):
-        allfiles = []
+        allfiles = {'maps': [], 'indeces': []}
+
         for format in www.settings.RENDERING_RESULT_FORMATS:
+            # Map files (all formats but CSV)
             if format != 'csv' and 
os.path.exists(self.get_map_filepath(format)):
-                allfiles.append((self.get_map_fileurl(format),
-                                 _("%(title)s %(format)s Map") \
-                                     % { 'title' : self.maptitle,
-                                         'format': format.upper() } ))
+                allfiles['maps'].append((format, self.get_map_fileurl(format),
+                    _("%(title)s %(format)s Map") % {'title': self.maptitle, 
'format': format.upper()}))
+            # Index files
             if os.path.exists(self.get_index_filepath(format)):
-                allfiles.append((self.get_index_fileurl(format),
-                                 _("%(title)s %(format)s Index") % \
-                                     { 'title': self.maptitle,
-                                       'format': format.upper() }))
+                allfiles['indeces'].append((format, 
self.get_index_fileurl(format),
+                    _("%(title)s %(format)s Index") % {'title': self.maptitle, 
'format': format.upper()}))
+
         return allfiles
 
+    def has_output_files(self):
+        files = self.output_files()
+        return len(files['maps']) + len(files['indeces'])
+
     def get_thumbnail(self):
         thumbnail_file = os.path.join(www.settings.RENDERING_RESULT_PATH, 
self.files_prefix() + "_small.png")
         thumbnail_url = www.settings.RENDERING_RESULT_URL + "/" + 
self.files_prefix() + "_small.png"
diff --git a/www/maposmatic/templatetags/extratags.py 
b/www/maposmatic/templatetags/extratags.py
index ceb87ab..46de4d9 100644
--- a/www/maposmatic/templatetags/extratags.py
+++ b/www/maposmatic/templatetags/extratags.py
@@ -45,12 +45,11 @@ def job_status_to_str(value, arg, autoescape=None):
             result = _("Rendering successful")
         else:
             result = _("Rendering failed, please contact " \
-                       "<a href=\"mailto:address@hidden";>" \
-                       "address@hidden</a>")
+                       "address@hidden")
     else:
         result = ""
 
-    return mark_safe(result)
+    return result
 
 job_status_to_str.needs_autoescape = True
 
diff --git a/www/maposmatic/views.py b/www/maposmatic/views.py
index 2bc6474..85c86c7 100644
--- a/www/maposmatic/views.py
+++ b/www/maposmatic/views.py
@@ -179,7 +179,7 @@ def rendering_already_exists(osmid):
 
     if len(rendered_items):
         rendered_item = rendered_items[0]
-        if rendered_item.output_files() != []:
+        if rendered_item.has_output_files():
             return '/jobs/%d' % rendered_item.id
 
     # Then try to find items being rendered or waiting for rendering
@@ -234,8 +234,8 @@ def job(request, job_id):
         del request.session['redirected']
     else:
         isredirected = False
-    return render_to_response('maposmatic/job.html',
-                              { 'job' : job ,
+    return render_to_response('maposmatic/job-page.html',
+                              { 'job' : job, 'single': True,
                                 'redirected' : isredirected },
                               context_instance=RequestContext(request))
 
diff --git a/www/media/job-done.png b/www/media/job-done.png
new file mode 100644
index 
0000000000000000000000000000000000000000..71c3af70a6f917f9fa06cb0bb57d4ff7b63d814a
GIT binary patch
literal 8912
zcmV;>A}`&EP)<h;3K|address@hidden;+S_h00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2igG#
z3Ihp%pz2Wo03ZNKL_t(|+U=croLps@@address@hidden|ERYr1kpLo_>}VWy
zkWJ-^Tphh$t|%i{MMk;T59)address@hidden&5e$M;eKWaPY
z)T!#~5EMtw=W{-FmRf(m=lMO)address@hidden)s^4d)s^4d)wdYCf==IY|*Efqnr8yCDa_H
zM2CPmAnH&mgrEwj1|%>F3<*>OM4wXZ5UA~F+FQCbwyga*2j3&0jBVjf%+O5zJRvw2
zI0tAxPQP%sP^?yh)tYWTv+idceUE_5w%|tU{AeFmN_-MH&3aGw3j9GYEsbqVZ|R_|
address@hidden(7lWO-8<>address@hidden)<p1>ko?j=
zX8!J#M~MAR60rDs&*=#Dc>$LLegMrQsIIAGamQ&anspi{PCJ9C_4Dw1f(address@hidden
z5kkwI14t#2(nKkVR3=g>q%w)bhuGP(p3VDSX2Z^x*t%yUvC$MtW(ZM?Ab8Nkym!+B
zZ2y}eV9AZ1^Mq1gRcVPqXb`RoapvL=a?Zl5m_OxIJh~4})6s;EQj-3$BXkYzp=WqM
z!?8Z%sVE5}M#4xNZ-uW4zqbOvCrEv0GR-wJXs(address@hidden(&4%By
z;jOjAM-4JmNMNNV^>45HMRN0hNdlH#?>$8#??rHGR$dl#oWKRA{2eE^UqH}TiKgkK
zj5yo6*0Q~8EpHupg+oKTFw7)address@hidden|w1~NrPhnomDNJjak3e85lm5{o
zytwUgo_zTsx{mZJX(|address@hidden<M027H|`w>0ZH-6Hnrb({Eya
z>uG30V8|334m`)pJ0E9z*IJ}9L68SsSia<V-&R>3RGti!BH*cH>GTh9+U!f2HEA&@
zNEmTm+Wt6Cyz~q9?>me%6+j%+x09ptJ6j$h`BzK8((CmVO7KIVQ3%xhxhIH^pZ^7B
zO<Ihm>address@hidden|Nwr?y7kymyP$X#|2p%m0rG_!o(3eN1f
z60aV>Fq6EpV-+i({VCl?db1z2LkVu!aKG`=Uljq%uOl#|>address@hidden>l^%
address@hidden<n51K=$UNqO&wGGy$Gn&XskD~ZJ;45`RQi5}FU;BVKEl~^
zufgxBAd(address@hidden<(KlvpeTobkSM_}IB$
zpek60VJ3NM)address@hidden))LWn{SC|81P9-wm9>|`jEOdnVJYq@;cXIVP^
zJfxBwJi48KUG;7D?%kXH*i|0G{N(address@hidden|xz%rz$B|0d;|(pO0ViS<aaEA#_cr
z^UzB?{>FU_$NE5{B=|YtMP6+RC8#*~IpeoJTI4711$GjYg7&6`T=l-s(->|go{F;a
zg&(r!<)address@hidden|Tx1T4MLbD>h|Q6SXP+`^}>_$qA;voU3g$JXA*x_wXQ
z0oDq^&&iJ_TxBTxeA^cn4r{jr0990e#wWp}`M7N9&79nRA*M8Wea9d9)v6y7k0t>Q
zn?k>E)BVZL<3)h}w!yza|A>N>K(KxKZ2tQ-chL}T;poUA9(e8!c66^pXb!N2%X#)W
znq|*kx8AdOOx|lUdrrCpnaE)address@hidden(y|O)7CJXIn(B|dH1U%
zlF6`!`e^ea&address@hidden|gSh2Ni)ZJG(dVz?wT4i66~?I1cy)
address@hidden(Z{>Z#11wUo|%uM>;K
zf<mY(rY!RQp=*QL`xhf%+4bI2(9|j*uxQ>guD|#;eBL0N_Wy~Mul`?5nM_NH&2pV&
zWUg6(&sx02+BF;aBJUX)26FG=Xg6d57X?sT0(=oQ76>AVVLA`I%&g|cG*!2<aP}#5
z?tP7DEE-ZmUD~uvJ<{_gBY$=RmfpxLg?JXInK^wnH(qiZK98T*c0I)t>wbz7G7qM3
zfTvlk)^Z;address@hidden@
z*|6&+lF3w9Q{wz7?^6$Utt0VgBVhS;1mc?Z6o~dI&28Lt>Hi|=3$cFh8lGJL0BFhv
zZZ7L_>UaUzqCkeoSvxMC<04z+$p9Dm5rtN6Z%eq}H;address@hidden@hL
zV;XXjl-kVh_3F_-8v(V;^dF$arJ+zIpSkL*gez*<*|na>address@hidden<N|Hfd
zhBO>r1ezxDQY3_3_ic^k(lMamswzxrvzsAP>^QQHc~efIp=vS>^-XNvxt8iC-+~2~
z`A^>Ybn3x(oPZ_Q>(>C^6`D{VyZC0&+Bl2D{kwVem3xsGHt^g4E_IGWs%(~>BT(3%
zD=cv&D?tTq2r;qzTM2g(6eLn{c6P1jgsG=9rLLX!mJ{jH*W&f-vs+HqckWq}ns7B$
zEBA>address@hidden&d5svHzOB#t2Y~c=YK_+BNSBnRA
zoNW#(DZ<{UaFaBV$)vK^2FAMi)7Ib7<m=$HX;;$XT?7I`)!M&)_<IE3F#=M$eizW#
z+|<GcmR*HXlK)(address@hidden@<pK(6|@iR8Iv1{*+A~vb`TEv
zD)ODP+l<DAtXOh8J}rn4f=?{^Csazu8_<K1RMpCNgn&gidQV31DNP7<@address@hidden(
zo?&<address@hidden@#sCGi^jX0|uIok>dG2!pLZ2AYe?V^7t9IVg1#HR<j
zXyz9|L7-Z@<f3m>EIIB32qk|2Xba~q6K##N7>@Mw;#-e9RmASH1=lSWU(D)kzzf%!
zk*fr0R?8Q5(p==u4P0w5FD!=(E;{ihZaw!$`1C+Q0<address@hidden)E_>s1T4PE
zbH0F6{C+>@F1r$iV$J49G0f!n)address@hidden;address@hidden|uOBjYzk+grfl`3Y|k2
zIyap8Z9Z}8KcZ=RzETUe<7?*Mfs%?qSf73I-JuJQ8v(*pw*xGle;Pr5C40KJu)Akd
znP7|Z2ob{FDsjqEVNJ+p{hHnKMJY)sqVd+7L0=`eUGgi=U+~ESz^xtt&=hQ^Ud%xN
address@hidden@{&kg;x$ElR
address@hidden@address@hidden<~~UrT?euinmRG5bBEni#krC!e7PSo-G_5=_(CknU!y=
zn~xhqtN~P`P=17402SqZN0;l<8&2S!k37rth7(+YcE?H(_BGM0WnSaq?zct2$=6a3
zTq*=Co_z*NDc;!i%*4AC93UJsZ?>9Gq5QZ9{X$a5`>dtYKEORIo~5B`O8K2C7IH3_
zc`H&Xd_jHg)jtW(K4t=vUTp>7o6<au>QFshgZt<idKV3|d<TXTTyVk-{NrW6A?T}|
z(Cd_?SE$C{Od!#O0E`4*KV|}i6n_seZ^j}NitUHq9H%d^yxSA**;dZubYG*j7t1~#
address@hidden(wIpFI7W+;Ywj(KSy|kd;zpk#JheigcYv7gyYQXK9&address@hidden>+v#k
z@&XJa$?opWZ*yEg;n0yx?_j<Q(E^rod5*Glt}91hukF6`eX||&F5k+l1^Ds>zv8N;
z|4<ZkH{kP~{e}1D)h)-23pB3?ZEOsGaKZ$b9_<address@hidden|AHjZT;<FV7Y
zl`63I9GWsetVGG|address@hidden|address@hidden<KR`E8WFus2e9t
zfKcKbfVQR?037b$bKC)UlNFo!TaJ~o0*`&S-c$DBC$8n?%yCQgZ2sxW)pSfcr6kbf
zc|o!JC)A&x2H2~eJ5d4zupFSdVJcEdx(4=*ulufmmv~+gfE0N!!~Q02TmBz()Sv1Y
z#b5zjDjWDXWl1TUbOFq7K9jpIf0pL(address@hidden
z0{$R1p$1~f2>qiy1zHS_VSmMNwmiqK)address@hidden;=Q*+Y9KQ7am9&ND+pS*a
zi6ARO5*s=8fRa8rtNo+ganWN``fE!9p9NS-d5nYzyhcsBk}SnpWfP!bE(DlV--1HX
zJ9MZph^kV7Q`rYZSqW0AxGZGuDFvs`xQ06~c#67;762-|VZQwSN2v|AWWaZmp+Zk^
z%F;E9Z{ybGKf|m0$F+PZWdYz;address@hidden)2~U%i^?WIAUXiTp&FEw43G7f)^TUB
zEC9C{Q!cuV;A2bg<address@hidden<!2n{hFhb
zvT&19=D>address@hidden|(&Knt&|AfA
zA6Us13%^(tq?Yg;address@hidden<k*f0X63KVEjD%DG#u-b#Y?*qIqA
zr4UAd?wv8Zc1I6Rn1JfaI+RijNBZ+JVjFi^D*tu_z9M^8I-0}n+<o~PmbG0lE<m#y
address@hidden)address@hidden|<address@hidden)!(UtnYm?t15HLCqRiN
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
address@hidden|Ddq~
zkK=y{gb?^VKI*C_6AsoPG)S5;_U+xv{;address@hidden)we}{;qW?kl>pvKfRzY&JPFXp
zA;Fs=!CO0(mew=1|LqBgB>=U}K{^&rCmgB=38pj|j`lJf?Z-3?I|)_~aLMJBa~T?8
z>1lJU`B}K;Xue(I^9HC5HBlL;&8#~o>Fw`g=ca>1h716b5uVudwE6AW0HZ|!H(fl!
zjf8i^1GLPrmh7V^Lx2wm;2}8U{n};WHgTP%Q>E#G){bhX&X_{TUxQKtX&Q_rh8c|w
zq{rh(`^dQh4=AOsB|RW3HyR;d6;;address@hidden;@A=on7?qjikFh4Gs_OSKr(J
zynF#jWxzFDEWH>R+55*VLDm=`+=8!*2Y51G;Lq#<z#nR&address@hidden|#GH
z>WmgD12v%1g*wwr5=o8_OGb#LA}DDV^inw%-75SM*(K{O9-!+!Dtwg$y&)=mRcN}7
z5b1evLu36M*xAL=gRyjpM3IUe<)Qtn&address@hidden;<vZ
zz}GY2`>Z4Yf%*<@&ZGt6YJW8+ArQJ(P~Td?<Y{%()z;zFDs26<Nh40uh><jt7-oW`
zk<9#Cs#)04F9bqpcr-6wj}MRT$EW-7dn)kgKFeylikLA<|Iq=u_YX4Il|W^IALQxY
zjpqLw+{+;#o&i1SuzWYbOX<address@hidden;_SyF1-nK5aher2$RlM(4O
zI8de2*j7nHQ!Q0BmH0gs2((;RrEQe7BJ<a^GE;TcY}Gp<M1HJ{08^z59Puvz00Klw
zL_t)Dr=koEjBvDTkb%Q-Qt`~v0+K|mpFei3H&>1vqBjG4GP66Sr<kR?1zk4+m?!~G
zPsmD<D3Y3L780B>!Mb|^Uu84RO$)address@hidden&Fdow`?0Rqvywv68BAkYJ^sKq!b;
z^CC$9&8>address@hidden(quY|ucN`6M<KRofyxtm)n;pN|bN
address@hidden@$prGl$j0(e=Xs#UUeR<aQ1vWp_#VD*S>address@hidden
zs&gov&;)^yhVIKWw7fcApPpVEBWYq9=|RJ0Qjv(address@hidden
zc+vv6Q6k{VaV&j2*(address@hidden<NWp*u)%BPVx1*g$pTTy0UXR-E9iP_4R8v}j)H
z%dW8~Ow*vxOmfJGurGR4ZS375Hzr1jIsi5-pqmb<$p&0i2H;lEi)B3O?R3b9aRRh(
zNnM?i<=S#CR^D((o$!YV*0kwUe3hz3^AQw2f*w8ncOhnyh+z_y31Z0+IWV}7!$zEh
address@hidden&D{ie^HBs=(=`avwkf9Yh7UOt{Rl3}s<0RZ|Mo+OCOfevx_p<j*
z7b`Ai+2es;?t-0V_g#t!ctyFpR^qjkIClG9ZX}f3$5!qxOT4zkP_nnzCtPl}R4isN
z4!Grb*F?W3;address@hidden|%`7~YHOR~P`-O5J$NN8viFEO)GS5{R-a?5CMwR(_
e?`?k#+y4hk#hDN7XM0ls0000<MNUMnLSTZ9(;oK#

literal 0
HcmV?d00001

diff --git a/www/media/job-error.png b/www/media/job-error.png
new file mode 100644
index 
0000000000000000000000000000000000000000..2fdbe9c9724f6e3ba69445e9e449d81762d3bb98
GIT binary patch
literal 5264
zcmV;B6mRQ^P)<h;3K|address@hidden;+S_h00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2igG#
z3I#Ndk^#m502B~OL_t(|+U=crkQ`Ti$3L%Mch9vuv#Y(eIxNYSkgz3lI7$pjVIU+X
address@hidden;fxE#BJ%ZXEvKfoNp5EGDvuq9iv
z(Ye~4J!f{#KHke8-J>address@hidden&^F+DTg-|address@hidden(address@hidden@t
address@hidden@bJ`9EH1oWVM2_}G_2lfEFfL#K10*Pkd(@+-hvVfO$us!O-|GXc5
zdYyn4l5N5-3;0FgZ6WY=Z`cq5(address@hidden>bPpJbf2ru6Y79
zh=cG};5P-lkHD+|U<yHMV1W3*0P$3c*x(?MR0<i3AuJ1o2r7Wqpf%d_P~|eE#YKvl
z48_Go3YiSq#YG&Ys{gkn;7I`oE%@)dz`v#lco^bw_>h1<0&address@hidden<zolas_J
zCXk853fQ&ec^=yLL2HC*B22SB$*zkk7AZ|nlRbBig{dhr*{t?go_$Kg=OXaXU9fOf
z6L1icIspBT1&jdnSr)^SlML_NNo3<jj7a1H;QsP5YIzw|ETRepRI!M5-2nJ{#V{}|
address@hidden|knKMJw{aXC-{<UYNP62zUm}a{=&w
zRWUPzeSK`&y_^1>J2CqD5JI3zCA`^L{G}!QOlAdW(address@hidden
zs!$;R>address@hidden;}M^=MIvb&&address@hidden(0|iS7_k`I_wmwc
z-05ljY_>k&VimVpA))G6CK8zA<5**32+Km1%M?$Y;@ppa%*_0J<;qhUK5{?&#}!Gy
z!w^rvr-9!CL_88<``*2z_UyrkM$wLgbM`Fm)YQc$rA_cf&3Ro5bQ1!qO_nt}ioJC!
zMl_0Y9CF8x^Xj2PEa&r;address@hidden;dKh00B#mSu;qpu*!ZS5AvbIQ-^V$5
z68HT10QhEr*8yL&(1yB1G$TQ45CUs#jL7!wU|Fc;WzvTZaq{?ayg)e4YPk1)_|9cd
zz(address@hidden(address@hidden@?v}uZTGr*f13n{U;ZNr+J1f?jQ
zIm64(K1+6a8Nd_p7x%&address@hidden(NVVDemmCaD7sXlboA(ojc*6=E~LM0
z5?T;address@hidden<TNK6D3omkj}rgLL2_;12+H?B31To8OEP
zi{Z`9Q95=EJg+l}?^61EK>%8VVG!A|18Z^;T`se5<OnZ4|2!(_&^?`p_w}NcBzgq?
address@hidden(X}Q|&w0P6((yu4DV#CZWl7=I}6)-Mc|+vd4~b^ttEo
address@hidden(=l0CQG#^5ctAf%-Dlb_(G(-#BRF5sPlzuKm1lj7&|
z`1A8vV`D@|address@hidden@$g~%
zrKQ(`x0VE~$_}(>Svd~g+#J@(2$7Ky22v^J&z!+mYMTe!?}4YD=+ZHFO~9Ao_X!B#
zb#HhB1FwHQ0EI(address@hidden&NSd6)I=g?a3^<address@hidden
address@hidden;;>address@hidden<>vsFe=P+7M8?FV-=f<@@+^b6Df!*u%plEQ|T6DXn4u
zuffqL;e}3r(&$3+2Mu@(uqQWdVr1`Lgl$tgas)qUFRyV7yT*BH&3YD9E>k>w7_??^
z*Dh|@address@hidden<address@hidden)?NAbd7)+H_LM24TwQ#x`4VcU%D
z+sE+mFhI(address@hidden@XPFO#AC$}7lZl5P9<
z6OBXw-sr+d*MxwBkQDGKfbF|>5#6*2KcA<3{P^0KmQF$o?SQxj+Tol&jkmCXJvz#b
zd-qnF<{v)*+j>rbfWHPdruzFC+Or2?nv`C6;kAP!>t&NG_P>E2(9Q0nhxb@|@kLOI
address@hidden>A^PMty(3hQVk^kr$PwChqnaRQl0u;tcU
zu?z#?SHBFu)H4DM_&8urPEHcvycu0CQ$BU7bKp7waTS2KWwLr$-05ljOa^OgjLqA(
zS4`0ZJs}{pXLn1`V>@?Z#N&b8SE~0C)dDE3bxTdqo%(_%$DL?h>7|address@hidden
address@hidden<o3?DJwjA9P
address@hidden)xezjZ<SV=<hH>FL(address@hidden
zh{(hQexcBw^fzlpc4MEr1-Q$Rv2L5qDxb%lokb1~GQM$R#TWce*8~W7Kfv&&O&HNA
z?%A`K&h&H&&MF;ow~pLBa|RKOGPGq2A|T-Ihr#NYfP=6{!<(aqLI38>2*bcjr`ONS
zbW1`nf2*4?MJ9tTmx)eHkc`C;FcOD5J0?KDeE>t_<H%$ZcWw^tx?O|Xm7Q(`T(f$q
z<49WL&address@hidden;ZP%CnUOsTUc|G0qmOK2-j<PE1eCE!~AZ(jd
zNC5Dz#~XzH>k{w?3<=mLg&;aQijWd-VIA^Tdr3kkzg6A#ulJP>tDnoEJr8SWh`4P7
z3^?${wh55%3xJVICNUEU{9G=`YFMRIuPUfkBh3u~s5DI*eb(Y!PfRD^EiNJ~i&PM*
address@hidden@+-->DDip^a~(Io0=FAs{(4RJo*Xuefef
address@hidden;_o-l7H_zz_Qv=&Rze><address@hidden
z5mI&*_3Wmp*x<q2(v}XjsiS*Xg|_Qr5n&iueSH{#AWa;EWJ?0R2m`>F6aq7mK)`DW
zXrg-cs_Me*v~0<A+X8A6NZm*%8a;E(vGP3pav2ec5Q|1Dru}s-39!P8qR}YAH1Uf?
zv{DU$>zNj``d*uMzNr&#(address@hidden)9bV5p^eSMWvH?`vfCIBL_7zlwX7VF#OCdW5?
z?sFvXxPz;y9KP|!j!ls+l^~hKj>RgcHnk)`K%WK-DFcZLrT=<q;+Pxw3g!FAa7u0X
zz5bRasB)2%5-kMU^E$J;S3CHfIN}gHV`T<sYXS&8wXA4BH3929)OUq2(zt;VVke}m
zSeO2GOi)Av2oX4^PEF8NN{a5n5o^x_tucbZ88k%N(address@hidden)s
zRwUn212p7-m09S9(YjaK%U<ghX8W6ppOh%AD-${pu-r~FGz;K)9!e>Ml=Z!S6Tscs
zS)4OxF5gzmS`bp_SQtj20pU1`YKH&~83FjNi*{W^*o*5#3r>IRV=F$TgUJ<oy|k#4
zpk1d~ch!$-nkdi13keWy5^zcY<x&alc?jFCFH!XfsS|k9tvYb)address@hidden>
zu8ULY%)+ZJ3Gm^B0e;zarE;7A5YxQi(R%_=D-v30N>?VPo8;Y9jwS1`B~)CQwDMBR
zR?u%l2{^3*r&vTgPOySWyAspnrrRDk;o_X1R)M^(gK|9p|25C66n-v;lTPF3^Qdwe
zCon<address@hidden<#xM|41|5xXpYT{%R&Y%#sc%QC
zsvokGYug}4uY!<^zz>1<vstv~AyX+(igGSj`H!F81x~vJ`~bMKkjc<DG=%K$$DN(M
z=w{n`Ov4BkQ<address@hidden)}LJsN*j#Ud(~!!Hyro?o0wp|z$M&K3op
ztM~o71PJ)Lh6k3jSw^)+_V;&Zi<Meg7ot&1p`tAnVr&~>Ss0cTbYw2E6Mjv2LF)kY
za1p6`u`&(address@hidden@address@hidden&nkn
address@hidden>tks6dfNoN8_EaayTCgOnGAg+
zBgkYDH9NcRU4891c#X6uB&gb?3DXRGkCZEZs^W|4E%c{UpsArCXwL)ByRZOYN73L4
zsNoW6&e9TYkj8(q(XyFl6La#EfOlpW7U&xu#vB~PZ9%}gM}<OyTA8`^?pd3|!)T>g
z3X|CcJk?NH8ip}~xxmg+E{9hvVk8oXNTmDb;H8RSu0d^Oe$2r^wC}SNCbKCx&@ln`
z!W{551uQQtptZ(aNwK){fm)+tZP);YL2-Vbaxj7M#rxq$9TN}&address@hidden
zjH?2uwGs$xd>pMci=nv|O{Bji0TK95;address@hidden>x-
zz)`CqAndvQ1Hk<address@hidden
zWwT(Km_tL?tcht<<=`MjJdRr^u(-6O2^RVLyOut?)dhD!&VYXem`$faYpgJ7_gXVC
z&address@hidden@8lR3aZXt?aR}YtF<pv=Zav!O{)cEDJ&C!SUh2
address@hidden|+$R!|3b7=<mNGleT&(Bt|@rIW&Y)ikWlgDu40m55UVkBOvS-
zd;$2Ls}ytTG+HU_aP8$Q$^7(EV1$%JHg5(Xn@&><Vr8fEZAyPf1PIU~SQpe=%w{QM
zv%!+T<address@hidden|address@hidden@~GUN~B2txUtY
address@hidden|?_h0za#?zOh^?k?ils2s0;Cy^!+d
z61eMOF;address@hidden@lV&z_|aJogKE`1Pm3?Wh6OvE2iG5<aM4x>znVGd+DFP9&4btIEXG
address@hidden>1HY8PBp*)BHsZ27Wm;1yw`DEOM4!%SPUZ`58myv#^K>h
zMWBqwiG*{1v-9)JFD#%z&A{*e34A}0Pt;lwAcOEwP`?H9uZNe1;N4}%k%m%4V=-hr
z9t=>g!RXngEV92Jdtw411o>>1bQo-#fd~E+zEX3!>NNo(h)P^kBj1Lpn_+qw-cc-<
z1-?%-8V!7cVRYmZ*2~0nYxAvOJvf$^mM(address@hidden<@b^RD+JxD-TyY6+yj{*
zxV_{!Lb)!nXcQTaBkOj?P%l>pEd=(+2<E^50GZJ20Gxv_eiS~_!hNV-5FkRZ&9GWk
address@hidden<Ou(s0c&p>O(kYjTMIs2xLdN5$X0M*QOpCBABID!8SPZQci?g#V1q1B*Mfj(`
zghy(Cu57FK{az4Y)B)address@hidden(;CA2l?R>FF%(9Rn2|@_eI*;9UrBy;;CX-m<
z8X2zRke-<#Un-%%{XTs1)9_za0IQn)+HFrXzznaIRr{|w_Y;^;!w+`D9#iYVT%mvj
zY|FxkM3C|LO6I|address@hidden&T3B8tJv)o%`;;O51bpJrAZg7fc!h~yvtNDA
address@hidden@H(Sv+i?F36uu4L*#pS|*im#GN~IEZ`0`C77DL$fN<PqKVs5O#L9BrRgkj*j
zF7vaqWWuz<H2mM+z=J=6vmwZhs$b{0XRRQkYFlr=QjId`XW(!G&TWESLaA7;SVVgs
zc9>*k#9|n>4Lu^F8_h9n8*^X)GnK-yEVNQ&GZ|(V7I1wZ4+_u0fd}D{<zRY|TUEW9
zeXnNUYv;B)8C$d))JT)h>=EeyF#N_&cvp}n1^uxYi9{lpi%gJxrb?yYU6E_76+%jk
zSZw93tl|address@hidden&v1n
z5RNMMN2Bz`VnH5gMUp))cmt~A1TXGf?E<kvVAwW>Z6m^MrTDH(zEEJfSVV<Q<address@hidden
zHF)f4I1);<Q?;$GZW999jt6x!+rnxEcD?>W<@oJz<DKxHiC_gO0T7jvc(|yAsLA)N
z_zG1qRZ6X-6jn{<5QedmI$z1g4!0Nopr%|bk}no1Ry79Z;pjKv$tU4(jj5?6p%E#S
z<BoC}yPfW0)PQca0N$$YKl~hQy%XNG8E&`2*OUvumXfG#V_Ozh)w_f{eUDgm4yfn4
zlpTkX<52dz3x?T)@-+PLoAA}I1#=?m+4p)xG$Ny8SG3ysMzRUm^?-j(Um^w3_rPs?
z;ccU^PgLcr8h|M!reR=8iIft<FoG(?1yZ!u!IC(kX1KnOuN1E5;rf0pDtaDXI0oPP
z3OqX#Ow0A^IMQZB)RNM*o$S?&xN40s8vx&^R{9ch68hf>address@hidden)Wy4i!e0{
zKRyXZo`L6&!(yHGd-cBCfRO6_t|We~2)HPA)du*r9l7dyp<l5Tl5d2~TVd-4*p!4x
z8~P+9BqU6TYA_TOJ;address@hidden@*tOkvvY868qOSolg9$Ut9z`KUTUMxRJ~dupr_5WwVs$O
address@hidden&emOxiMiAS)H78w)QoD-8xbHH5K!;lbsZAw
z5zvf?wmVQ)Dgn)U+4Vvk^$4I14WJGIx(@J{e1!B$TVX>address@hidden
WnIfR6ap>~^0000<MNUMnLSTZjG6}K(

literal 0
HcmV?d00001

diff --git a/www/media/job-in-progress.png b/www/media/job-in-progress.png
new file mode 100644
index 
0000000000000000000000000000000000000000..105773dcda0e4daa420aa243c3a394036c14b666
GIT binary patch
literal 10329
zcmZ`<Wl$VEv|XgMSaB&(+zQ2A3uSRD?k<bd#T|+jiaQjC;_mLUI4$n(3oP!ikMI3^
zKVD{TPGs(6k~zthN%%J<X-qT{GynjADJuh1eMRH{<Q>Xuy_M?D{|d+;aYb<epe6?W
z$>hyzAHi8w`YWJvg6#0MLun?Xst5ph(E|Vh!2rO+>rlV}0N~0F02~<u0D`Fi0MYl1
zRu$pb2^3R#Y2YiqmV1dd|5rf$E~Df8y7b(Cf)MNInepGC+jnu$D;oc=cq}ho0RRjF
zvOsZlkEN3i>qLWj*Y*45{r8T3Jo)S~$f&qv2(fwAvW4_QvU;_Nz!~%5WSVcX?xsaw
zTxzG}8|wt4r)pOtm!iqS)$!$ntsruv6+MlGGSqacxTvwzGGD1Vu(`fno(&3Ru2P(O
zYgD0Cp=nTx`C6ScIIM22Zmz)address@hidden<p=J(Z&asvY47WWTlb
z^Z6x#a*P6$3>%F~Y9ZM5xiYIbnXcQ-sLv#VT|GTN3;pM+z>*iGc>gK<b_feF$8`iG
z*>|%V^HnQq%zsM!AuNY*rn_7JPVondj7G5RhVXYp{wdvTu)aI>xd?QY^l2m4$bS~0
z<CgEG7EkZ_6tv!Pd|yR^;C(|address@hidden;RZ4?vcQB%h+m=vrcR#42eDe==1?=()s&G
zE-kS#Iefi5{#=}XWD^Bb0$T!&D9Kd(xan?_4b%;56~p-Uip9U*&l2XdB0DI&h|`Pt
zD_i74P&address@hidden<address@hidden<Vq4wP+8)#Ra
za|au|otKf1>1Lvp{YtDC$eufgkygU{A-$A~SHsMvaoD9m7JERuOfy&o=bqz?WuwjJ
zD&){^hOGSY>40P=Qs@>=r<oq+QT65-i|L7U<M9g@;>{|address@hidden|Ox)a?
z13Fx|N$%!w3c6e}MDcRk;bfJ<U<zQ8L-Vq=txOFJ{QSAL6c>address@hidden
zv)3ae%_f1rhKZe;ItIy~<;<X80IO74<Zi9(qVm?~%!H(~r^bu)?1OO`n&X=+k6F}a
z5ZnmI3Qzo3Si9P$zhp~GRbpIvBNlix+GGwZX~?pjH`q$PZ+UqM(address@hidden>a$
zWxSIqFqTljB#~Xi+Ua2n12UoDbkxgT*AURZ)E!2K(3#UqgyW5owDUIz*0puJdbuh6
z9T&Y?E#&PF?;qd|`);iFqE}3~)%!1#n|dijv_g`*?i$w=yLE;y$<WXi+gmSQj3n^K
zAdSqo^#$jeEx^b9rZgJMXl}yOh<8%RX2_5L4(msp0aUYTOhZAD9%Uo){ilV`;`n+v
z0#s*`8<%KofZ<$?--UYqP%iTojM7$|yI>|address@hidden)ejWP|S(address@hidden
zA-<}UIPY5ri}^VO;rSk2gLhW)MMSY2MThcu)f<BL*&^^Zv50p)uE_Ho0QDm(h6&}%
zV|gOa`xX2s%VNqRpa=4fGob)evB=fmN7l#AAV<%z3O(l>4C*IojWsP+OS&-AUUqVg
zIHNaNf>address@hidden>1#7)0F`+vrT`ow=bGOvgA2(RI87}iuPCrF(
address@hidden)IEoS>}dT9VF
zzh1lJmBNB|address@hidden;address@hidden
address@hidden)-JpFMyM2r=n-j<c}l9xiJ|NSOUo<Igyo>;G!
address@hidden)address@hidden;zV{&{}S3OHScvx|}M_-oDj
address@hidden)W^d->0YC{omJ)3r$Hze&cQzI*t><
address@hidden(o^MCPM>_={Bad<+~gvBA!A6^<uYv~S4F4RpZ|address@hidden
zYy>oW5zy;address@hidden&B9K4Bo4ycc6&13QQ`T%D09^~Aj
address@hidden<X8HeRPN8mTxKekZ`ytQm%nz4Rt<Cp<U?u)2XDJ3$7
zTZf|Rtkb1{J;xQHi#53^3`YEr-0Tck$y|^>)6nXp=+iws;7IG{<address@hidden
z#X<MWuJ4b84hx*Ah-}UwHSf;l*xR>As@>address@hidden)sq_r(v
zN3JYoq2ua9tMG>i7#^Km0S<=-y0sK)kcfca?&-&s+vN1cPOuno=Y4|@$xc2Zl&J%x
z(f~t#$=v^))#k9+&oYn6W~{4~bDilV$+Iy5zn`peB|6`7FF6tleT;Y-Srua3d*bHq
zrq=5?7}(dZa*MLRcd%ZhtLWf_-D|u2KymLh<Lf5U;_WauqxvFl9=;Wu0sA)Ay3%YB
z(17%&6Mn3d<+W+o@(;address@hidden&n4^>Mr#rYCWPEEw!
zxmzN9z&Z1{<FT>Uq&V2%DlpS~3Q<p?tZ!y2+4GWpeN<6MoztDjc3L}DgRbT<kMI~V
zF@<3px0dikJ7m$T-<*ebo20h0FSCtrN^Ru4udir)LH$|_*-r<!vj?4Xnr9*982s)~
z+hZqUnzPd-h<w}uzr-(9v<VsW*0`R7Heq~UcI`75m(XjA`r}~26`59oqM$`GrjBG2
z6()s^GeD>@kU9gJw9voMiBT1mXo<~LABr7q_NWYk74p#5lz4w&NT&Ulh>^^th8~se
zcC1}C6BxYc1*A~`91MG7B>GgY3yb+HM^gxU|K0}CoA2+5`<>sgm<#_zS5uS%{WjMJ
zRiau!qZpZMCCli=)Jq6B_0(I~Qm%Kh^myYYy=dp$ta43tbw%~C__;Xy&g;}NI{8Ok
z8e}VQCVq7GtFfc#Lt?KD&;+tOoswOVB<HY_iOCtK^hV;Z$!54{!*Lt*$7yvI<_{ji
zc+bQ{!qQ59at8+gStZp<Ef3}H3(n2L2<address@hidden|&7jy#`BkyVLrn!NpQ
zX$R-}I|-*(3vrVD@<s_ij`&hj(s8LKH|B)&kua6qx};}EA)yZ<#qVPm9D%11$S!5V
zs=v{yR5~1f;address@hidden&t%}8+kUlK5cE<4d
zzH#c5pPNqZ%4UsN{-t!{C{;43m2R!AC-jx-<g!#;f!*Z8QOy;RuS16eW+}T0D*u;7
z${IlsquTquXVIjjhQTuGZh2f&vypB+5eV3!#UV8VR=A{Wvz{(KR>u}~cDFg5K~WW}
zJ-~so?hKCX0b>ll1Dm4u2`Jm+-ie-JZhSIE=EjbUz($KlTE$o)r+1s&Q80t`E0`_E
zr9jXJ+Sy2dzP`4uv6<;8#0SH1=fZjYQ<1oVL#BGPMVJm>8$PJn4_dS6Zy7BA`Z$=3
zo`4z1ZldUz>=pY;address@hidden)uZ(!z``%bs7(1`Vww`k5Se-N*
zE)cbHJ9bj=m0V^DO8^?~zA#Jd+){)y_ihH{`yUjuw%2x8lRg)n@>xEYkMJk;&SO8e
z=yDLd1Y#4SWARKNA9)E%o1w6X&M_OP#cveQWXLxb%431{foPsqom8;sWSo&o*5weT
zrO(X9kzVsdI%e@(RPi!5113%)?k;-dmFFJmFj{eS!?J^oS1Mc)axwmTmm&ORT&wdI
address@hidden(4a@&U
zIMp#s5k=A?O5?fV{O}<address@hidden>Mg-FCC
z%XZ2;J}loh)Y$0h-J{<*3mU*oj0KTs9Nwyv9^1w91fs%w*t%$MOAT5l^xGI{_->8t
zY^wHACGndrx5_NZ*<address@hidden&u=>sA6#)3QQPz9!cK)Q
zE)Jp?CKOxs=B~leYum-<!k;`MIyPykhq^~6E?!?Vi{0Wmq(|ak?B1eYg7jj|>F~>Y
zkw4}5mafE4dX<xYrb47i;OV?Nh{zx<address@hidden@address@hidden>JS9Ej7CN66B
z_s(f^DM<#JFWn65%l1a#4|FBxJ&OrqzweeW8g$G4kmly*K)%yRIycU<Fnt|+s4IhS
z>address@hidden;J#UXgB<Dez4>
z2QFVwsub54A}BzaQP<s2g|QkPC;I^qaJmQ|address@hidden;-d8G0lge?8nT7x3~S`n1zB
zCUl|0EVV~9v>nE7h+4u+v-B~1m!?S`kB-{8qT9y20oxAoLSz8r!}{i8iYni<>&MWC
zQQa{R-nui*q%%ntRNVlQ=4Jru1!tT~aar}tBA#KYJZ9u4GgPS*_D*AUq<}=9$q9C8
zQQ?M>od&@_3z?%1VPAaXyPjW^1)Ra5K7$q#{?R?ED3GB*HW&1zkkM3%RL8fP@;address@hidden
z-GY?!MiVNw!NPub7$)XAT;address@hidden>QxV=J{|c`vUhk9>
address@hidden<#rY(rElLSo%_yuwUqB;#2Byy3mld?5GX-?wFhb`wnhRy9w4Rd3MHd
zIjyW_XkQ}vCdJWG4!L9)<address@hidden>k}(address@hidden
z_eKE1t^{`QU*R5S&&2EKcBwueHVvpRq-VYO&-?3&?gp`<Ie9hmGj11zQ;RY#_XO*i
zt$l>fVc!EkTh+!}8cXsRPd>address@hidden;g){TUN&tZ^ddc>a}lI|`vD42Y<ri$_Zs
z78%F>Zc9Hyo1z&IS;1=T?Yc7zzaj^mKK=dSY`Wvl@(|qc&>g`5aT`-le>#G?aV(^R
z?2VG8Qn7)<yX;+w2nUg9`W+<address@hidden;address@hidden
z$B$e`t(G%9miVbE+=zn&rOf_iWo*j65A!vpIA@&LVef1oBJeLnYcvKyLGpsSqiNX_
z>address@hidden@!CLA_k;JBo?C}q1AZd_nd97uRk6`-wBx=8m&230Mrqu~#FtwXFTp#j57T0^u
zI6vD$?(Fq00#;EjC<q*u8eC)NVXIPu&address@hidden
zd`_F8g89YtEOlJcVr4kdksP^D!5`bH)6`C)Cs^>$J)n<66lF*0jpeZIwT|Ua^?B)L
zTs;LHJEJ_EAE(Yum!jzm2oR0&i2+uPG5mvL$!INR(HseZg*?Vempn?cu|r|OuT&P9
zC&L7?>Xz++RFHH9N;|?{C`uo0Hh<tcwmS=T?2_RnxmkI3sx?jxHsL+JNBoRk6<kly
zfbf(2Df4De9lF;address@hidden&&A5&gZx0o3|K?bCpS-X11_npW
z(MLD9(ZzJMZb-cU=U-7ualpJkMhaV+So(p>)ewuWHZGr+E^ndrSwbALe$`j1&%#zL
address@hidden>O*<%<Wibk+*qt%!avASg
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
zZmMHUN?kWbcS5$VsEd=Ny;xi3KLU^3h#p7SKscwN>@>jplDy3wqs}d-|COzyoB2fU
z>d;address@hidden|n%g1Js_4bX?(!GjVq8>DVAqt1m4KNtkZY
address@hidden|R19D(XG`AsQFWx_yH*E}??>#(@A0A1{9t%>address@hidden)e
zE*Bah-kV423qlQ%fLUddc<address@hidden&q3!+`-}R)a(3kRA&r7bN
z=c%a|M`728to<0nX14GI{gx(RV=RO0XE6ScZwLb3QK-#6OaD}ty7>2Nap)t*krgx~
address@hidden<0dV<H0}d>iK2$Gm-szTDx2VKKG35^%|@c4QBy&}L+!mkY466x
z=7BZODdDpQ=|5}F#fC41#*{xWlEyjZUHM#=a8-F;{T+ola0mVPS|address@hidden
address@hidden@y7YRPRi{`#94v1^)EarWyVQ;)address@hidden(
zyO+5W7<|&GI0HVMz|address@hidden@D@<-<*?6!7yT{*U?0(xmN8J*Qn{OPd$
address@hidden&`UZ_kozi0GFmO6UWJlAtz+U1)vnOBRA&%deK)hyoF29D~)r
z%;&Lr{hS(@sg;t9){(_U8yquQIaL{EE`0#D?97d=g|address@hidden
zrt!2mX-Krs<=x#s*sLDi5v|address@hidden&y=oqpQiCk^J-Hz2;3Y
address@hidden;address@hidden&+)Ixi*}S6kQ`wXqw>XdZP7Y;FC8gTwFH#eZ
z&x>z|address@hidden|O>address@hidden>o>Q&{T>ASbt2E~3I_
zeqOcm+22)?7q>e<8>1ckPTpp(eV=cmK(~~BubAz(w=;BUls-o**Q~x>(0<74e+m84
zF7l=R*`L$zw8OZu3N|^U2h;DvBt>KWrmoR671qAJZz=cI-;2Zh>dK?$pH*wt{uJMW
za!XSrhoys87JnpaIzm{6mdDqCq)address@hidden@FICgK(RNKWqLz|w7
zYWn&rLn-0UA2p?DEnG`doPkJrQ7Gr%grcTIGw2|K6a$k!Svm(address@hidden
zf|94djoVO%$5|TiH*eneP>^CF<KU?2lh4HHwVg9($nwDX&979<PTR4{s5gFxdwyP*
z<address@hidden|v0rC0dGP9R1nS^xYf=lihUEqfo#kRK8zbcGv%C
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

literal 0
HcmV?d00001

diff --git a/www/media/job-in-queue.png b/www/media/job-in-queue.png
new file mode 100644
index 
0000000000000000000000000000000000000000..cfe751ea89b625661c296ab796c3b91fb5261e8c
GIT binary patch
literal 11457
zcmV;yEI!kTP)<h;3K|address@hidden;+S_h00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2igG#
z3I-m21e?<U03ZNKL_t(|+U=cpm?T$u?tkZ0=<ez6neNGHbJmL021y7dO9&Z+5J4hK
z0)uQU2hwBG#el(JY_Kl|+ZV3EHXyN>address@hidden;p)90L+N|address@hidden|Oy{aP_m5NE
zUER~OJF8&0HnmS}*Hq}PdfzXd?|kPJ{C4^6@;`YIzo|E-K<s=oE2YC0A=#`HD}gQ)
zZ3x<cHoyT2Kw7|@address@hidden&address@hidden;yyH0veyCr#yk;
z9^fuRarb%KIr&=x{AI_RSSl5_pm;s7Hh9dAMTvFw5N_`w+}wrP)QTC7A?*-GC=Aj@
zc^;mVM-}pTP60PJOJQo1{KPQX(LvH9!xS^w8s*|address@hidden
z!P|tEcmu$0h>%#bf%wXEXy{&pjCX-Bp4pFiMV#qDGAEBP+joHJ<address@hidden;+@
zXY1|U``?}b^-<*RC%F;DM}XA;X2_!TdFPSba1nObIbehW7kH4LLFK0)KLhz`aC6`}
zD6ar+K|g|FA&d|R6U+#Nnjn-wgpy##LCDH?7SrTT?qlNd2ber|6tC!%jy#0o6I-_P
zGoiKQzYhWGqsU#yc(o9G48?kYSZ5pU7hXkd^#zDfq5^nk6qO!=xj|address@hidden
address@hidden;address@hidden&P<&wXc7E~Sf`FYjvq31n
z1YDwlZ>Q_hYiU?{K}Fg#BdF=4sOcxc$yUIw0$SCuaJnZF^N1<$vEzuuYD97!l!$jS
z%s%lT!w>wN>}1&`d|OK1z4<l<|Gy;Qz-zGcHXlInK_C=rjI-qG8;Guc0Z0>+hnhZy
z8ruW8Nnfx7=$5y|;=!NyRQ|O!qzGSAh;|}c&qFjV*T<b4sr~mbaQ6>z^96vkQhaFZ
zc0Tu9nWg8106(address@hidden
zi$$DV5x3|address@hidden<J9%jA0oyBvAdGB?3yC5otlRZ9ybf0RlHY#>l<jV(jr<
zCE|aM&COfC%-C-{0XuKxWkPT}kchOju>9q>V0W(52j_<Hh8}?2WB_;t$a&K4WDBIm
zX2?#b$)?ie(>address@hidden&Q9?XzMC>o}rDM~|address@hidden)@O;93B4S<address@hidden
z0zkHZCw<@h3dKwYU{JvuwtbEJe<KM{Aa>u(M^Stj5UuBKru%o_f(XUH$)biIMok?>
address@hidden|2{vZ+j!(ko%$HnieJoAE*kRHUgKW(p^V%*{bDgE>2lEX>uo
z070~+kwi}`jqM4fW%|G??f88ngb*MNM9aB|j`KlUxan~Qe(=wvjz0z9Ah>nw?fmO+
z6an9Q4aS-fpI7iUAtg(%zMjO^m*}sb8^k+t7ZfwTjaNGC7gBF4m>ZvF;`k_YW7B0n
z;Ds8=_g+A;eI0J|8l2|kD8pWqD9G$I#>`2~vBTKId$C3jBApxn(v&oHHq)}ai*Qpz
z1qS7oHA4si;UseD)evq*c||53{!a$)`+3P#eR$h;{^~b^fP1dMY+AxsQM^$YCaYh2
zD-FxHXj?zF8#S^MrM!xLmxgb06tkmKj2u2eE|mtr4L6Znbrt!g7vZ*VK$YV6dEup)
zZ%qPTdR_$O7O_t4Bl6^3*aMGfG6clileDkuA<address@hidden<x
zAAds&iQpf%+|E0nsdE<3RPtBbd<((address@hidden&z*E;ZusDV3Bsey{r3)^qiDsnS(
z3?JwtJ*i{wVsZtU=e?T3vWqKHUb4$VU<iR}Ss12?Wf(|9B7`VMGoI(6l+upcb#aPC
zT*txn^lu0KjVR;@ANd&#2fmAu)zMc|S1VoTEXRz5d?FmZ`r06xHz0a010hL2`6y3*
z=U-8-gM!a(address@hidden|G#=H~Zew=M%Ghu8m8NRRm7>y|1=JjY}FNIzqJ
zLnu$-#JfpvxrxGx%e1unpi3zUhr@)!A#B^m5CSHT<Bc9ejUIuSA;?UlveT&a6snLW
z^qvQ*G(jnFoFe%`fqX7cKA$fW1t8oap`*Vbw)address@hidden
zfmm`CNR#Zz{T%)JKcHL}6#r}McK+tSoPb?7@&N>YEe%txebb+bQ0H1Grt$iItfL&|
zJ6SUX3i7jQ26i4MKbt{Gll1dmOLo(1QHBLVAcY_ji4bXs5DtZ4dJyl}1E{0-;`Q%D
address@hidden;!8A^HNa(ObD47pscqM5lAv7KKba`X-aidbuc-mU8}L$-F(
zPF`z{5IRa)b`2P|)`V|address@hidden<<address@hidden|g_L6T>;8m><(t9D;yw9&
z$oq~|m|%nfMQUi2lY5TfIWEPPRirL?H*RvdHZO)G8jTT+MKP3zI&=rlW7|=K`>UcD
zD;address@hidden;uITiS<kfCrKm$|t)(wPj()BediwU7Ay
ze}|cwzzEqaJ%2sXmZV0gm<2qo39)X(@|S`%nb~_M$AA3q00pJ^oo(BB<T)o`_wTV>
zIqU(NR$Ti=8aG`9o`cu-!;0Av7ML3Ru_FVF9C}K})vK>&_62{W^D|NskHv|_qR7G=
z-i~kJ?)WBZZX5tBY!Pp5B;JuA)}BOK78nLX%BuU>`<?p$i2dc^a#W=PE$33$TOuJy
address@hidden;PAuHCGg1?5)E(bB6yNJj7f2Ez~B0nl%H
zY&address@hidden)9rcKd%8l0!lG*=qbjI4uCL7J^xm+>t2Eol1L;%
zV^brhAyJS2fa2YsMP;TCLeSU}rMb76XmcE47-0CVTIGQffks>PB8311N`NR4ArwLh
zl+YvyKnYPM!7v1gM3QJU#!PC4JTP<BM{st2mDqvrFtF<&T?L1hl|5iKKryW&x|u#0
zdI-^TDQ%bBKziU9se!&_j^N7*UUfE+(OD(i-+2iiL-59Mb1TbkcqhWJQ6rC{rk<#n
address@hidden<address@hidden)MSG;C$;HcssuZ#T<>v2us$sk?d;1
address@hidden;c`u=H1LkoqFl0wm;&~+Z3
z)j()?4|5|En2|7%WRp%Fx<address@hidden>jB;address@hidden
zupYttg%GTG)address@hidden&umzVbulm%acy6sDuCok%2tI(#R^
zf4dPixSvqSVCkv^Ju4E}wgk`9cDb}F-CEUc3D4hFbu!TsDFjl=^0tr?S>address@hidden
zyz+HI5R1iVYiq?cEwUS5$;`!?)S<@@address@hidden@#a$W{K;K!
zq3u~GKpOlLV0B;address@hidden<!#{fa<<address@hidden@dbbgYG|<}8jA2N;
zyZ#>MyYGWShNdQqWh-Muqh=Z065uFrJ{dt$YVS|V3i$rE6r%EXiHI^8!Bw{_q!3t^
zMQd9tb|^${)m5anya^PX*tws~#EjNLGpb#TTf`f<6TBh~D=wgQ<9VQH7DYbwtP-&M
zW?lnaWyc$7x$rvu<3smDF{8n-VhCwbn9Xo<*FjK_y6_JvEO|b$c${Q&5-9}kPd|bC
z$ZZG|9qkrfoi-9x1~v$`@@mOY)yHc{2!dS!RU(66%WBDAhy=qhXlZUH5{ZyK_tngu
zdjrb#II&|NZoxqqVKB6xBR7Q_(H5uk%GY67mQwJ0yKmy+XN7=!uE11EGrIJ}uS3{T
z-NK#e(;!F-VMI_KoY=7s&address@hidden|Xl!gmpm2Zkmw3Csixkk?E=a^gS(;Tq
z`s+!&Cc`&B!DCgK(address@hidden;YknA>address@hidden@_
zD+a>Qrf6ax<fbs<9rRprtw6URKK`r_km%vHz>0WJFVWQ(g6E=!A1J$d5o!V<7&&~D
z>~xA^(-P*+zlDZagAcwy{o>Pjd%mZ^Z-a&q^(8(4bTt`jo=>Rt1+palvW5hItuOWU
zNYD;jJ7__oIZ31;address@hidden>1R|3t+ffW~C#en64f{31e)address@hidden
z2qkzwK-Xn210hl4dm*1Hn;wKkes+%WBYh}oGJW}b2*;XeYDyr4K<)address@hidden
zBt*4oQ42_X6&b!0u4Af#8X%-7JJ>2`D`kz8FD&^2F^`Z$B7tmbW9HI#gAfewdjh9W
zKo}7)B3cXPhEOwo2s1+Wr7!kV=zQ=Q5wPcGt^qd1Iy;Cg->Rz-CiZFR7ecEcilN>6
address@hidden;33?feiDF=q%Zm9a*=>tR{>MB5E&)AA9U6M0)i%`EY&_C
zvPu)address@hidden&cLeCU4SBf&gIzA27qh!yooJO
zUjsbe0nl;address@hidden;!HAGX_F3JA8_{u}R#9R??eZO>=WILQ1~!FJI<epSq3TKe!ny
zBx#J+tJ$d+;hd#k2t+|uPT1FiYN?ksB+NHG%rixLHKaiz(Zt*ZZ$()VrjDN^Kb!I!
zo(&q4>^LelfUu%;U3?XQP#(8FEdqAEo^AwJn~^ZFRp)CnF#dQ&`a_L?VEphgoh#q^
z7GlXZOw&XFtqF~|qXaiTem=X#qIDTA+w#+foeMbOpb08RJi!pOUf3Btwy^2J_XEMS
zcqkMi(z1lq^Ii+U*rB8PxLv8BRAYMpXk34hZZE)Vj=r7HSrZ^k-U!InP3MCdLCv0o
z!dylAkz^*un46fU*wl-+_DW*WsNcmZxc-edbNR*Rm%r~%_H5*z4tC=xQCACsrl>+j
address@hidden;9>Mb14N~OALZ|V~oOv>u~KD(<e_+n4JY_YmAhF%qhrE
zBV(O3uU-R?oSWw5XH9^D8v&9VF48-uk5tI9V<0NhpWb*qO^JkG&`^<{Kl+nfx&D>c
zmap4B*vnfV-ay}MxVrr0G-2l%opc~$S{;g3*7Co3z*D|g5lCaq(*i15AcZ8}+D>Nu
zbtq3UdF)C3+*YiTg`Lt^HE+74wCkp`B4EcGSPyItCllD6Yr!p`X8ZlP-v$}R$!16m
zkKu*li1jbQw9J4FrQFH=y4T&n4L7`^{M|>>G2Zg%xqP#)eZDDL(AEdj5vr~UDn~tH
zeq*bm6#+>X^-RuuEtpRNghOG9=UxX=GC44aay-9vEVVP9J_aZnmY?Sr0C3HL*AQDY
address@hidden(?j+WF3%^pj9%dnX`uauB5y+2xlLYfc6dUj%MiKg8=_`zl_3-8JR!&wG;3
z9$U^kcC2NhU{ye^jq$w&{6dh7Dkpq;6H^6#Fv(ZP-q$4|kl<@*TSBH|Gj6^}dhArC
zU7!>cXCXI<u;Vl?TM1z0Z7y3p0g5XCV$0U+9qFOUK`ROfrjMV{CVc(XNLi`55rOhR
address@hidden&tuYGaV?>sh@;EfNR%RM8>1;Wl6Q&cY^s&c}WywB<4`Vxrq?R}7hN(G$|
zHH82`C}iWTyBdJ0z5)G|cEAkH>59h2mFJe)1XnJK0Kbs$cMuTnUaj}d4e97dS|Dwl
ze3taoG;XL7d->address@hidden<IJmd
address@hidden;ZUMwhHBU4GS~2-x`s
z)&address@hidden>v>qVUEQxHYD|#tluM1JKfd)AUi88%$^<mV
address@hidden@a$df*)address@hidden)Nv=I2e`ksSAG>;address@hidden
zhurj(&XoE|I+Y#<<zcrjLz))A=ErX)dPV|-WCK97Ynhh*>{!{>3M;BhGsgT9$t7E=
zWhYpLTqR8vZIDv(_CNhYF2C$zJkKMY&C=PPBpk9B&V{)3k#&6GPzOavohCOFASM_E
zEnxS9rbUQa&7`WMrdDegD!wiqb9%RGD?K{qX9s+Yy#f?wK$=9_I{~EUvgXVL2t7<F
z)Y7Se&(8#lE&)M$T-VbWOE#aO$GLu&address@hidden<l>8PU60Z689LfpXimgY2yT0-
zlegZ#ioTS+V4|+PU6qcmiD>address@hidden({SK>h_?Uz1qfSCMNw7oN&bt<fcG*
zG_-Z=T?XsV>;wD(6yfGhe}qb)kJ$);66905ph~tbuP-Iy%)S3oN<Q%3ck%oS&&PFL
z22YLB6pymBrya{OIXc_Go9|address@hidden|4ETUw=XkV!#
zyO|mN;AWtWlb->l2(@&SYJt}-Mg!IWSWPXuXf;2hor+-t22MVMTXgUuNwA~OsI1X6
zO+Ng=_i_HVEjW(HiJ>tJ!(address@hidden&KF#*R}ZMsN_-<f_!S$
zFMADDB(N|8%EeB!m9AN}m?)?TK-xONq+EZ5q0}Aa#cW2C8SgyX>address@hidden;5eANm02
zo%cK(*X88U7_RHl+1^Y~XDg;Dd2}qsjlWpNT>}mCO;O;>N|m8%!5>wpxiPi4o31@(
z*r<jip6B6avwr=nr4JX=pghcQv~)?!nKi&4n=33!KcrjK4=Qv?x0lxqG8&p{AGa#I
zKy88Sf+s;J6ymQw_F>address@hidden)address@hidden@O
z`$tSNuHk=ODT_+E?x%cz<sz*BcB<address@hidden|`8QU|}
z1;uqIyrqBCuaDFvArjAZe1(Ym4<M>R4LAT5C}0-;G5w)address@hidden<&*FcKJe!s;n3kD
z3=EC3th*i4H0bSYWjd8+bYhC14aE4xKn$-eLCu^SP4TY%2iSPdhCuO^Ukx`;GgKA%
z<-MvN1*%4%D#xqHvl=RZ3t1Uj>lFYGY1viSo~b1q)9DCb14;#|(f}dwTz^E09jUo7
zRZ}2dBW{8Jl?py$1*~Yaflqz%<E&Y;iek}WU}y~2|address@hidden&)pd(%za
za_b-SmD{(M3D6~*s-gi4Xhx-mw6>(NT2q7n&r^m_gFjZp^^1*+^57AaLYj6Jwr3*1
z3ns{d4Fo-!Ma)ylD)1FG5*3ibpyUN>address@hidden<%;DLibYNgkC87F85$YK
zQ;Nn|lvT^RS+=B;r9B<2UfxYxO9G`7U-;sexbOZ4s!1pjp;TZfTD^O!kb_e51*(p(
zC>QvuaxCl*JQ4E}jSJbadM0QN2zkW<hV2i2#__*I=o(FcLZ*BZx}3Z8y9%X*HZ%S)
zg+eG*E(;XC?a|address@hidden<Z3jQ=jBr?|DD{11C5!IELqWG{zd}>S(6Dy`ARf
zX8QX2$mjDkC*nvc85x`8&;address@hidden(address@hidden<-%x9|YR4m&
zwWq4yw1TMgvCu8v(r6oe>^$5`W%ulv2~f-;Xi-iUEK3h51(address@hidden>CrdNfomAmON00
zsX-QH5-NV7<OhPanH6&UhYB2PY|<pW^UvPP;Ls_A5VW@@35UbH;G&C>Qqt7e#IGLx
zm9E}sj53p&C6_O<|KLIPA3Qj(-O<+CN>6V$z1`h(_jJ+Q-9=|-2d%9w2(hqM1_ybl
zDv#n5;S-<*R#YTj8v2?-?korp`XsNAhp?{useGx#uysR2<Yr3VwM;}%(address@hidden
zh43Z4q9OWWs<address@hidden
zMX^|<P;e*|9g2>_$ml2|qoeHFwWsPj%d+V1?xd@;ldi5#I=ebZG{srJb`5sOsw#8W
address@hidden&=^q5E3h<9l4ku4450=6qTxz
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
zL_t(iPrErgprzlAK|?#rDKN5Yhi-E!KKYEt32(if9|3#QBO}Zn_qCvLso#cjP!sz>
z2wJwih<address@hidden(}T9Q#*~ypL{;r{t3V7&?ir$>dgKMQp={^9GX)C)0dk6j
ze)>address@hidden@address@hidden>address@hidden>&ybP>Y;0yy!&J$S`D
zL|P%#sI?$Hgi4=6m=Tt~_;r{e8>8<address@hidden(_8>-rV2d}A$fK(+yS}+Q#kW}|O
zf=*d29MUSUdbRHO8|3H_LQQeHue<?-si#>k<$WTpU_~j;&M@@YuK<ds;KPgQb6C`L
zHUGSqqqlD2Jg->XfO3iTEY*V%vg29;GGmB%FEWy(p}CRiV~3H0`%sZ2UdOt5wE${?
zI;g4+4^>@address@hidden(JWst4+IsLySo?o~VVkUa#m$(F9gv?w
zjqTJOa7GA`Tn$1pc;B7mrY1q~*)address@hidden)xMUetv<address@hidden
zRDKfCv;sTXLqp7Fy6-4P|D$-Z4!pM2^J_AK8Pck<oZ2#~5(B|address@hidden)&tNVD
zepSYkKr3D!w;sD4`?1>*Qn2!6uOr;O9#j!;=zdU+9*>Y%4MvEW{-;W|e=wBi)t^5|
z;aMf%i;pvN>n4i8)pLU<Nv>Io3`M~$Ae^io$WfR>#Cr*~Eya|1W>55E9)AeWYQXK>
zFi+}L;J>QvdG$L%umXSA{3|ETs0Nw3r6)D#2h$FohxOnWuy<?+V8zwfmB&hZgZD#m
z)}KGF3&KeXb940l{70o(6mL228|address@hidden(0v0KQmD$LE2SiTZr$DuHb
address@hidden(9pda%XCPcIF32+7`R2;o-LIjJT<j7)%7-ko~WA2HFdho=0af4(}s$~
address@hidden(G5FrICu6{Z34VUWs9)1Y2W7_VAnh^0`JkO)=&Yw`!eboQ5b^GGy
z3OZ{7KK4u0pKjzAp5(^-)MVTYhiPbQ*CQtjGYI9P{Hf?gw3A5BS|V|anZ9EfL;H}Y
z4&p33U)Rv9>Z-F^4XD=vUfZ!!_71h_V}j<U4)|5IKb8ExNDUMI{`)acJccw)R$cdc
zVr!nSBax9El?Ip9fM{BwC+^tsD^h)Z0Q<ZKUj4<L6rVE!0P%(WWN%u}9^2r?*`X6M
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
address@hidden

literal 0
HcmV?d00001

diff --git a/www/media/style.css b/www/media/style.css
index 5be5b37..b306f9c 100644
--- a/www/media/style.css
+++ b/www/media/style.css
@@ -306,35 +306,6 @@ ul.errorlist
 {
 }
 
-table.list
-{
-  margin: 1em;
-  padding-right: 2em;
-  width: 100%;
-}
-
-table.list tr
-{
-  background: white;
-}
-
-table.list tr.odd
-{
-  background: #FFF6BF;
-}
-
-table.list td, table.list th
-{
-  text-align: center;
-  padding: 1em;
-  vertical-align: middle;
-}
-
-table.list th
-{
-  padding: 0.5em !important;
-}
-
 div.pagination
 {
   text-align: center;
@@ -388,3 +359,74 @@ p.infobox span
   vertical-align: middle;
   display: inline-block;
 }
+
+div.job
+{
+  border: 1px #ccc solid;
+  margin: 1em 0;
+  padding: 1em;
+}
+
+div.jobodd
+{
+  background: #FFF6BF;
+}
+
+div.jobeven
+{
+  background: white;
+}
+
+table.jobinfo
+{
+  width: 100%;
+  margin: 2em 0 1em 0;
+}
+
+table.jobinfo td
+{
+  vertical-align: top;
+}
+
+table.jobinfo td.thumb
+{
+  width: 220px;
+  text-align: center;
+}
+
+table.jobinfo td.info
+{
+  padding-left: 2em;
+}
+
+table.jobinfo td.status
+{
+  width: 15%;
+  text-align: center;
+  vertical-align: middle;
+}
+
+td.status img
+{
+  width: 64px;
+}
+
+h2.jobtitle
+{
+  border-bottom: 1px black solid;
+}
+
+h2.jobtitle a
+{
+  color: #0066B3;
+}
+
+table.jobinfo h3
+{
+  margin-top: 0;
+}
+
+table.jobinfo h4
+{
+  margin: 1em 0 0 0;
+}
diff --git a/www/templates/maposmatic/all_jobs.html 
b/www/templates/maposmatic/all_jobs.html
index 24fcb3a..c4de4e9 100644
--- a/www/templates/maposmatic/all_jobs.html
+++ b/www/templates/maposmatic/all_jobs.html
@@ -43,56 +43,10 @@ class="activelink"
 requests received during the last 24 hours, starting from the most
 recent one.{%endblocktrans%}</p>
 
-<table class="list">
-  <thead>
-    <tr>
-      <th>{% trans "Title" %}</th>
-      <th>{% trans "Location" %}</th>
-      <th>{% trans "Job status" %}</th>
-      <th>{% trans "Submission at" %}</th>
-      <th>{% trans "Rendering started at" %}</th>
-      <th>{% trans "Rendering finished at" %}</th>
-      <th>{% trans "Position in queue" %}</th>
-    </tr>
-  </thead>
 {% for job in jobs.object_list %}
-  <tr class="{% cycle odd,even %}">
-    <td>
-      <a href="/jobs/{{ job.id }}">{{ job.maptitle }}</a><br/>
-    </td>
-    <td>
-      {% if job.lat_upper_left %}
-      {{ job.lat_upper_left }}<br/>
-      {{ job.lon_upper_left }}&nbsp;{{job.lon_bottom_right}}<br/>
-      {{ job.lat_bottom_right }}
-      {% else %}
-      {{ job.administrative_city }}
-      {% endif %}
-    </td>
-    <td>
-      {{ job.status|job_status_to_str:job.resultmsg }}
-    </td>
-    <td>{{ job.submission_time|date:"Y-m-d H:i:s"}}</td>
-    <td>
-      {% if job.is_waiting %}
-      {%trans "not started" %}
-      {% else %}
-      {{ job.startofrendering_time|date:"Y-m-d H:i:s" }}
-      {% endif %}
-    </td>
-    <td>
-      {% if job.is_done %}
-      {{ job.endofrendering_time|date:"Y-m-d H:i:s" }}
-      {% else %}
-      {% trans "not finished" %}
-      {% endif %}
-    </td>
-    <td>
-      {% if job.is_waiting %}
-      {{ job.current_position_in_queue }}
-      {% endif %}
-    </td>
-  </tr>
+<div class="job {% cycle jobodd,jobeven %}">
+  {% include "maposmatic/job.html" %}
+</div>
 {% endfor %}
 </table>
 
diff --git a/www/templates/maposmatic/all_maps.html 
b/www/templates/maposmatic/all_maps.html
index 0c483a8..9ecfae3 100644
--- a/www/templates/maposmatic/all_maps.html
+++ b/www/templates/maposmatic/all_maps.html
@@ -34,46 +34,11 @@ class="activelink"
 {% block page %}
 <h1>{% trans "Maps" %}</h1>
 
-<table class="list">
-    <thead>
-    <tr>
-      <th>{% trans "Title" %}</th>
-      <th>{% trans "Location" %}</th>
-      <th>{% trans "Thumbnail" %}</th>
-      <th>{% trans "Files" %}</th>
-    </tr>
-  </thead>
-{% for map in maps.object_list %}
-<tr class="{% cycle odd,even %}">
-  <td><a href="/jobs/{{map.id}}">{{map.maptitle}}</a></td>
-  <td>
-    {% if map.lat_upper_left %}
-    {{ map.lat_upper_left }}<br/>
-    {{ map.lon_upper_left }}&nbsp;{{map.lon_bottom_right}}<br/>
-    {{ map.lat_bottom_right }}
-    {% else %}
-    {{ map.administrative_city }}
-    {% endif %}
-  </td>
-  <td>
-    {% if map.get_thumbnail %}
-    <img src="{{ map.get_thumbnail }}"/>
-    {% endif %}
-  </td>
-  <td style="text-align: left">
-    {% if map.output_files %}
-    <ul>
-      {% for file in map.output_files %}
-      <li><a href="{{file.0}}">{{file.1}}</a></li>
-      {% endfor %}
-    </ul>
-    {% else %}
-    {% trans "The generated files are no longer available" %}
-    {% endif %}
-  </td>
-</tr>
+{% for job in maps.object_list %}
+<div class="job {% cycle jobodd,jobeven %}">
+  {% include "maposmatic/map.html" %}
+</div>
 {% endfor %}
-</table>
 
 {% ifnotequal maps.paginator.num_pages 1 %}
 <div class="pagination">
diff --git a/www/templates/maposmatic/job-page.html 
b/www/templates/maposmatic/job-page.html
new file mode 100644
index 0000000..e444b39
--- /dev/null
+++ b/www/templates/maposmatic/job-page.html
@@ -0,0 +1,58 @@
+{% extends "maposmatic/base.html" %}
+
+{% comment %}
+ coding: utf-8
+
+ maposmatic, the web front-end of the MapOSMatic city map generation system
+ Copyright (C) 2009  David Decotigny
+ Copyright (C) 2009  Frédéric Lehobey
+ Copyright (C) 2009  David Mentré
+ Copyright (C) 2009  Maxime Petazzoni
+ Copyright (C) 2009  Thomas Petazzoni
+ Copyright (C) 2009  Gaël Utard
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+{% endcomment %}
+
+
+{% load i18n %}
+
+{% load extratags %}
+
+{% block menu-jobs %}
+class="activelink"
+{% endblock %}
+
+{% block page %}
+<h1>{{ job.maptitle }}</h1>
+
+{% if redirected %}
+<p class="infobox">
+  <img src="/smedia/info.png" />
+  <span>{% trans "You have been redirected to a similar map, rendered less 
than 24 hours ago." %}</span>
+</p>
+{% endif %}
+
+{% include "maposmatic/job.html" %}
+
+{% if not job.is_done %}
+<p>
+&raquo; <a href="/jobs/{{job.id}}">{% trans "Refresh the status" %}</a> {% 
trans "(the page will refresh automatically every 5 seconds until the rendering 
is completed)." %}
+</p>
+<script type="text/javascript">
+  setTimeout("location.reload(true);", 5000);
+</script>
+{% endif %}
+
+{% endblock %}
diff --git a/www/templates/maposmatic/job.html 
b/www/templates/maposmatic/job.html
index d41e388..a269da6 100644
--- a/www/templates/maposmatic/job.html
+++ b/www/templates/maposmatic/job.html
@@ -1,5 +1,3 @@
-{% extends "maposmatic/base.html" %}
-
 {% comment %}
  coding: utf-8
 
@@ -30,109 +28,45 @@
 
 {% load extratags %}
 
-{% block menu-jobs %}
-class="activelink"
-{% endblock %}
-
-{% block page %}
-<h1>{% blocktrans with job.maptitle as job_t %}Map <i>{{ job_t }}</i> Status{% 
endblocktrans %}</h1>
-
-{% if redirected %}
-<p class="infobox">
-  <img src="/smedia/info.png"/>
-  <span>{% trans "You have been redirected to a similar map, rendered less 
than 24 hours ago."%}</span>
-</p>
-{% endif %}
-
-<table class="list">
-{% if not job.is_done %}
-  <tr class="even">
-    <td colspan="2">
-      <a href="/jobs/{{job.id}}">{% trans "Refresh the status" %}</a>
-    </td>
-  </tr>
-{% endif %}
-  <tr class="odd">
-    <td>{% trans "Map title" %}</td>
-    <td>{{ job.maptitle }}</td>
-  </tr>
-{% if job.administrative_city %}
-  <tr class="even">
-    <td>{% trans "Administrative city" %}</td>
-    <td>{{ job.administrative_city }}</td>
-  </tr>
-{% else %}
-  <tr class="even">
-    <td>{% trans "Bounding-box coordinates" %}</td>
-    <td>
-      <code>
-      (lat={{ job.lat_upper_left }}, lon={{ job.lon_upper_left }}),
-      (lat={{ job.lat_bottom_right }}, lon={{ job.lon_bottom_right }})
-      </code>
-    </td>
-  </tr>
-{% endif %}
-  <tr class="odd">
-    <td>{% trans "Status" %}</td>
-    <td>{{ job.status|job_status_to_str:job.resultmsg }}</td>
-  </tr>
-  <tr class="even">
-    <td>{% trans "Submission time" %}</td>
-    <td>{{ job.submission_time|date:"l d M Y\, H:i:s"}}</td>
-  </tr>
-  <tr class="odd">
-    <td>{% trans "Start of rendering time" %}</td>
-    <td>
-      {% if job.is_waiting %}
-      {% trans "Rendering not started yet" %}
-      {% else %}
-      {{ job.startofrendering_time|date:"l d M Y\, H:i:s" }}
-      {% endif %}
-    </td>
-  </tr>
-  <tr class="even">
-    <td>{% trans "End of rendering time" %}</td>
-    <td>
-      {% if job.is_done %}
-      {{ job.endofrendering_time|date:"l d M Y\, H:i:s" }}
-      {% endif %}
-      {% if job.is_waiting %}
-      {% trans "Rendering not started yet" %}
-      {% endif %}
-      {% if job.is_rendering %}
-      {% trans "Rendering not finished yet" %}
-      {% endif %}
-    </td>
-  </tr>
-  {% if job.is_waiting %}
-  <tr class="odd">
-    <td>{% trans "Current position in queue" %}</td>
-    <td>{{ job.current_position_in_queue }}
-  </tr>
-  {% endif %}
-  {% if job.is_done_ok %}
-  <tr class="odd">
-    <td>{% trans "Thumbnail" %}</td>
-    <td>
-      {% if job.get_thumbnail %}
-      <img src="{{ job.get_thumbnail }}"/>
-      {% endif %}
-    </td>
-  </tr>
-  <tr class="even">
-    <td>{% trans "Result files" %}</td>
-    <td>
-      {% if job.output_files %}
-      {% for file in job.output_files %}
-       <a href="{{file.0}}">{{file.1}}</a><br/>
-      {% endfor %}
-      {% else %}
-      {% trans "The generated files are no longer available" %}
-      {% endif %}
-    </td>
-  </tr>
-  {% endif %}
+{% if not single %}<h2 class="jobtitle"><a href="/jobs/{{ job.id }}">{{ 
job.maptitle }}</a></h2>{% endif %}
+<table class="jobinfo"><tbody><tr>
+  <td class="status">
+    <img {% if job.is_done_ok %}src="/smedia/job-done.png"{% else %}{% if 
job.is_done_failed %}src="/smedia/job-error.png"{% else %}{% if job.is_waiting 
%}src="/smedia/job-in-queue.png"{% else %}src="/smedia/job-in-progress.png"{% 
endif %}{% endif %}{% endif %} title="{{ 
job.status|job_status_to_str:job.resultmsg }}" />
+  </td>
+  <td class="info">
+    {% if job.administrative_city %}
+      {% ifnotequal job.administrative_city job.maptitle %}<h3>{{ 
job.administrative_city }}</h3>{% endifnotequal %}
+    {% else %}
+      <h3>({{ job.lat_upper_left|floatformat:3 }}, {{ 
job.lon_upper_left|floatformat:3 }}) &rarr;
+        ({{ job.lat_bottom_right|floatformat:3 }}, {{ 
job.lon_bottom_right|floatformat:3 }})</h3>
+    {% endif %}
 
-</table>
+    <h4>{% trans "Rendering: " %}</h4>
+    {% trans "Rendering submitted" %} {{ job.submission_time|date:"l d M Y\, 
H:i:s" }}.<br />
+    {% if job.is_waiting %}
+      {% trans "In queue, position" %} {{ job.current_position_in_queue }} ({% 
trans "estimated completion time" %} {{ 
job.rendering_estimated_start_time|timeuntil }}).
+    {% else %}{% if job.is_done %}{% if job.is_done_ok %}
+      {% trans "Completed on" %}
+    {% else %}
+      {% trans "Failed on" %}
+    {% endif %}
+    {{ job.endofrendering_time|date:"l d M Y\, H:i:s" }} ({% blocktrans with 
job.startofrendering_time|timesince:job.endofrendering_time as rendering 
%}rendering took {{ rendering }}{% endblocktrans %}).
+    {% else %}
+      {% trans "Rendering in progress..." %}
+    {% endif %}
+    {% endif %}
 
-{% endblock %}
+    {% if job.is_done_ok %}
+    {% if job.has_output_files %}
+    <h4>{% trans "Files: " %}</h4>
+    <ul>
+      <li>{% trans "Map: " %} {% for file in job.output_files.maps %}<a 
href="{{ file.1 }}" title="{{ file.2 }}">{{ file.0|upper }}</a>{% if not 
forloop.last %}, {% endif %}{% endfor %}.</li>
+      <li>{% trans "Index: " %} {% for file in job.output_files.indeces %}<a 
href="{{ file.1 }}" title="{{ file.2 }}">{{ file.0|upper }}</a>{% if not 
forloop.last %}, {% endif %}{% endfor %}.</li>
+    </ul>
+    {% else %}
+      {% trans "The generated files are no longer available." %}
+    {% endif %}
+    {% endif %}
+  </td>
+  <td class="thumb">{% if job.get_thumbnail %}<img src="{{ job.get_thumbnail 
}}" />{% endif %}</td>
+</tr></tbody></table>
diff --git a/www/templates/maposmatic/map.html 
b/www/templates/maposmatic/map.html
new file mode 100644
index 0000000..df094ff
--- /dev/null
+++ b/www/templates/maposmatic/map.html
@@ -0,0 +1,55 @@
+{% comment %}
+ coding: utf-8
+
+ maposmatic, the web front-end of the MapOSMatic city map generation system
+ Copyright (C) 2009  David Decotigny
+ Copyright (C) 2009  Frédéric Lehobey
+ Copyright (C) 2009  David Mentré
+ Copyright (C) 2009  Maxime Petazzoni
+ Copyright (C) 2009  Thomas Petazzoni
+ Copyright (C) 2009  Gaël Utard
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+{% endcomment %}
+
+
+{% load i18n %}
+
+{% load extratags %}
+
+{% if not single %}<h2 class="jobtitle"><a href="/jobs/{{ job.id }}">{{ 
job.maptitle }}</a></h2>{% endif %}
+<table class="jobinfo"><tbody><tr>
+  <td class="thumb">{% if job.get_thumbnail %}<img src="{{ job.get_thumbnail 
}}" />{% endif %}</td>
+  <td class="info">
+    {% if job.administrative_city %}
+      {% ifnotequal job.administrative_city job.maptitle %}<h3>{{ 
job.administrative_city }}</h3>{% endifnotequal %}
+    {% else %}
+    <h3>({{ job.lat_upper_left|floatformat:3 }}, {{ 
job.lon_upper_left|floatformat:3 }}) &rarr;
+        ({{ job.lat_bottom_right|floatformat:3 }}, {{ 
job.lon_bottom_right|floatformat:3 }})</h3>
+    {% endif %}
+
+    <p>{% trans "Rendering completed on" %} {{ job.endofrendering_time|date:"l 
d M Y\, H:i:s" }}.</p>
+
+    {% if job.has_output_files %}
+    <strong>{% trans "Files: " %}</strong>
+    <ul>
+      <li>{% trans "Map: " %} {% for file in job.output_files.maps %}<a 
href="{{ file.1 }}" title="{{ file.2 }}">{{ file.0|upper }}</a>{% if not 
forloop.last %}, {% endif %}{% endfor %}.</li>
+      <li>{% trans "Index: " %} {% for file in job.output_files.indeces %}<a 
href="{{ file.1 }}" title="{{ file.2 }}">{{ file.0|upper }}</a>{% if not 
forloop.last %}, {% endif %}{% endfor %}.</li>
+    </ul>
+    {% else %}
+      {% trans "The generated files are no longer available." %}
+    {% endif %}
+  </td>
+</tr></tbody></table>
+
-- 
1.6.3.3.261.g85c6





reply via email to

[Prev in Thread] Current Thread [Next in Thread]