-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathpractica-final-2019-y-ant.tex
More file actions
2437 lines (1579 loc) · 198 KB
/
practica-final-2019-y-ant.tex
File metadata and controls
2437 lines (1579 loc) · 198 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
%%----------------------------------------------------------------------------
%%----------------------------------------------------------------------------
\section{Proyecto final: MiTiempo (2019, mayo)}
\label{practica-final-2019-05}
El proyecto final de la asignatura consiste en la creación de una aplicación web, llamada ``MiTiempo'', que aglutine información sobre municipios de España, y especialmente información meteorológica sobre ellos. A continuación se describe el funcionamiento y la arquitectura general de la aplicación, la funcionalidad mínima que debe proporcionar, y otra funcionalidad optativa que podrá tener.
La aplicación se encargará de descargar información sobre las condiciones meteorológicas de los municipios, disponibles públicamente en en sitio web de la AEMET, y de ofrecerla a los usuarios para que puedan monitorizar con facilidad las previsiones para aquellos municipios que les parezcan más interesantes, y comentar sobre ellos. De esta manera, un escenario típico es el de un usuario que elija los municipios que le parezcan de interés, y comente lo que le quiera sobre ellos.
%%----------------------------------------------------------------------------
\subsection{Arquitectura y funcionamiento general}
Arquitectura general:
\begin{itemize}
\item La práctica se construirá como un proyecto Django/Python3, que incluirá una o varias aplicaciones (apps) Django que implementen la funcionalidad requerida.
\item Para el almacenamiento de datos persistente se usará SQLite3, con tablas definidas en modelos de Django.
\item Se usará la aplicación Django ``Admin Site'' para crear cuentas a los usuarios en el sistema, y para la gestión general de las bases de datos necesarias. Todas las bases de datos que contenga la aplicación tendrán que ser accesibles vía este ``Admin Site''.
\item Se utilizarán plantillas Django (a ser posible, una jerarquía de plantillas, para que la práctica tenga un aspecto similar) para definir las páginas que se servirán a los navegadores de los usuarios. Estas plantillas incluirán en todas las páginas al menos:
\begin{itemize}
\item Un \emph{banner} (imagen) del sitio, preferentemente en la parte superior izquierda.
\item Una caja para entrar (hacer login en el sitio), o para salir (si ya se ha entrado).
\begin{itemize}
\item En caso de que no se haya entrado en una cuenta, esta caja permitirá al visitante introducir su identificador de usuario y su contraseña.
\item En caso de que ya se haya entrado, esta caja mostrará el identificador del usuario y permitirá salir de la cuenta (logout). Esta caja aparecerá preferentemente en la parte superior derecha.
\end{itemize}
\item Un menú de opciones, como barra, preferentemente debajo de los dos elementos anteriores (banner y caja de entrada o salida).
\item Un pie de página con una nota de atribución, indicando ``Esta aplicación utiliza datos proporcionados por la AEMET'', y un enlace al sitio web de AEMET\footnote{Sitio web de AEMET: \url{https://aemet.es}}.
\end{itemize}
Cada una de estas partes estará construida dentro de un elemento ``div'', marcada con un atributo ``id'' en HTML, para poder ser referenciadas fácilmente en hojas de estilo CSS.
\item Se utilizarán hojas de estilo CSS para determinar la apariencia de la práctica. Estas hojas definirán al menos el color y el tamaño de la letra, y el color de fondo de cada una de las partes (elementos) marcadas con un \emph{id}, tal como se indica en el apartado anterior.
\item Para obtener la información sobre previsión meteorológica de cada municipio se utilizará la información disponible en AEMET:
\begin{itemize}
\item Ejemplo de información para un municipio, en formato XML
(para cada municipio, el número de cinco cifras que finaliza la URL
se obtiene del documento descrito más abajo): \\
\url{http://www.aemet.es/xml/municipios/localidad_28058.xml}
\item Documento JSON con listado de municipios, incluyendo su nombre y
su identificador para localizar los documentos anteriores (campo ``id\_old''): \\
\url{https://raw.githubusercontent.com/CursosWeb/Code/master/Python-JSON/municipios.json}
\end{itemize}
\end{itemize}
Funcionamiento general:
\begin{itemize}
\item Los usuarios serán dados de alta en la práctica mediante el módulo ``Admin Site'' de Django. Una vez estén dados de alta, serán considerados ``usuarios registrados''.
\item El listado de municipios se cargará de nuevo cada vez que arranque la aplicación, a partir de un fichero que será parte del proyecto Django. El listado se mantendrá en un diccionario en memoria, y no se guardará en almacenamiento persistente en la base de datos.
\item Los usuarios registrados podrán crear su selección de municipios. Para ello, dispondrán de una página personal. Llamaremos a esta página la ``página del usuario''.
\item La selección de municipios en su página personal la realizará cada usuario rellenando un formulario que estará en su página de usuario. Este formulario permitirá elegir un nombre de municipio. Si el municipio coincide con uno en el listado de municipios, se considerará válido, y se añadirá a la lista de municipios seleccionados por ese usuario. Si no es así, se le indicará que el nombre del municipio es erróneo.
\item Cualquier navegador podrá acceder a la interfaz pública del sitio, que ofrecerá la página personal de cada usuario, para todos los usuarios del sitio.
\end{itemize}
%%----------------------------------------------------------------------------
\subsection{Funcionalidad mínima}
La información para cada municipio se obtendrá a partir de la información pública ofrecida por AEMET, en forma de ficheros XML, como se indicaba anteriormente.
La {\bf interfaz pública} contiene los recursos a servir como páginas HTML completas (pensadas para ser vistas en el navegador) para cualquier visitante (sea usuario registrado o no), excepto donde se indica que se servirá una página XML:
\begin{itemize}
\item /: Página principal de la práctica. Constará de un listado de poblaciones que han sido elegidas por algún usuario, y otro con enlaces a páginas de usuarios:
\begin{enumerate}
\item Mostrará un listado de los 10 municipios con más comentarios. Si no hubiera 10 municipios con comentarios, se mostrarán sólo los que tengan comentarios. Para cada municipio, incluirá información sobre:
\begin{itemize}
\item su nombre (que será un enlace que apuntará a la URL del municipio en el sitio de AEMET)\footnote{Por ejemplo \url{http://www.aemet.es/es/eltiempo/prediccion/municipios/fuenlabrada-id28058} (donde el identificador ``fuenlabrada-id28058'' puede encontrarse en el docuento JSON con el listado de municipios como campo ``url''},
\item su altitud, latitud y longitud,
\item su previsión de tiempo para mañana: probabilidad de precipitación (0 a 24), temperatura máxima y mínima, y descripción (0 a 24).
\item y un enlace, ``Más información'', que apuntará a la página del municipio en la aplicación (ver más adelante).
\end{itemize}
\item También se mostrará un listado, en una columna lateral, con enlaces a las páginas personales disponibles. Para cada página personal mostrará el título que le haya dado su usuario (como un enlace a la página personal en cuestión) y el nombre del usuario. Si a una página personal aún no se le hubiera puesto título, este título será ``Página de usuario'', donde ``usuario'' es el identificador de usuario del usuario en cuestión.
\item Tambień se mostrará un botón, que al pulsarlo se verán sólo los municipios con probabilidad de precipitacion mayor que cero. Si se vuelve a pulsar, se verán los que tengan ptobabilidad de precipitación igual a cero. Si se vuelve a pulsar una vez más, se volverán a ver todos los municipios.
\end{enumerate}
La página principial se ofrecerá también como un documento XML, que incluirá la misma lista de municipios, y un enlace al fichero XML que proporciona para cada uno de ellos la AEMET. Este documento se ofrecerá cuando se pida la URL de municipios, concatenando al final \verb|?format=xml|.
La página principal en formato HTML includirá un enlace a la página principal en formato XML (``Descarga como fichero XML'').
\item /{usuario}: Página personal de un usuario. Si la URL es ``/usuario'', es que corresponde al usuario ``usuario''. Mostrará los municipios seleccionados por ese usuario. Para cada municipio se mostrará la misma información que en la página principal. Los municipios deben aparecer en el orden en que los ha seleccionado el usuario (primero el que fue seleccionado más recientemente).
La página de cada usuario se ofrecerá también como un documento XML, que incluirá la lista de municipios seleccionados, y un enlace al fichero XML que proporciona para cada uno de ellos la AEMET. Este documento se ofrecerá cuando se pida la URL del usuario, concatenando al final \verb|?format=xml|.
La página de cada usuario en formato HTML includirá un enlace a la página de ese mismo usuario en formato XML (``Descarga como fichero XML'').
\item /municipios: Página con todos los municipos que han sido seleccionados por algún usuario (aunque hayan sido luego ``desseleccionados''. Para cada uno de ellos aparecerá sólo el nombre, como un enlace a su página (ver más abajo), y el número de comentarios que se han puesto sobre él. En la parte superior de la página, habrá un formulario que permita filtrar según la temperatura máxima para mañana: se mostrarán solo los municipios que para mañana tengan previsión de temperatura máxima entre las dos que se indiquen, si se indican.
La página de municipios se ofrecerá también como un documento XML, que incluirá la misma lista de municipios, y un enlace al fichero XML que proporciona para cada uno de ellos la AEMET. Este documento se ofrecerá cuando se pida la URL de municipios, concatenando al final \verb|?format=xml|.
La página de municipios en formato HTML includirá un enlace a la página de municipios en formato XML (``Descarga como fichero XML'').
\item /municipios/{id}: Página de un municipio en la aplicación. Mostrará toda la información razonablemente posible del documento XML obtenido de AEMET (en cuanto a predicción para mañana, en el rango 0 a 24 horas), incluyendo también al menos la que se menciona en otros apartados de este enunciado. También se incluirá un enlace a la página de este municipio en el sitio de AEMET. Además, se mostrarán todos los comentarios que se hayan puesto para este municipio. Esta información se actualizará cuando se consulte esta página de un minicipio, y a partir de este momento se mostrará actualizada en cualquier otra página del sitio. La información no se actualizará en ningún otro momento.
\item /info: Página con información en HTML indicando la autoría de la práctica, explicando su funcionamiento y una brevísima documentación.
\end{itemize}
Todas las páginas de la interfaz pública incluirán un menú desde el que se podrá acceder a todos los municipios (URL /municipios) con el texto ``Todos'' y a la ayuda (URL /info) con el texto ``Info''. Todas las página que no sean la principal tendrán otra opción de menú para la URL /, con el texto ``Inicio''.
La {\bf interfaz privada} contiene los recursos a servir como páginas HTML completas para usuarios registrados (una vez se han autenticado):
\begin{itemize}
\item Todos los recursos de la interfaz pública.
\item /municipios/{id}: Además de la información que se muestra de manera pública:
\begin{enumerate}
\item Un formulario para poner comentarios sobre este municipio. Los comentarios quedarán a nombre del usuario que los ponga, y sólo se podrán poner por los usuarios registrados, una vez se han autenticado. Por tanto, bastará con que este formulario esté compuesto por una caja de texto, donde se podrá escribir el comentario, y un botón para enviarlo. El sistama anotará automáticamente quién está poniendo el comentario, y mostrará esa información cada vez que muestre el comentario (con el texto ``Comentado por'').
\end{enumerate}
\item /{usuario}: Además de la información que se muestra de manera pública:
\begin{enumerate}
\item Un formulario para cambiar el estilo CSS de todo el sitio para ese usuario. Bastará con que se pueda cambiar el tamaño y el color de la letra y el color de fondo. Si se cambian estos valores, quedará cambiado el documento CSS que utilizarán todas las páginas del sitio para este usuario. Este cambio será visible en cuanto se suba la nueva página CSS.
\item Un formulario para elegir el título de su página personal.
\item Un formulario para seleccionar un nuevo municipio. En este formulario se podrá poner el nombre de un municipio, que si existe, quedará seleccionado para este usuario.
\item Un botón ``Quitar'' que aparecerá asociado a cada municipio seleccionado, que permitirá al usuario ``deseleccionar'' el municipio de su lista.
\end{enumerate}
\end{itemize}
%Si es preciso, se añadirán más recursos (pero sólo si es realmente preciso) para poder satisfacer los requisitos especificados.
Dados los recursos mencionados anteriormente, no se permitirán los nombres de usuario ``municipios'' ni ``info'' (pero no hay que hacer ninguna comprobación para esto: se asume que no se darán de alta esos usuarios en el Admin Site).
%%----------------------------------------------------------------------------
\subsection{Funcionalidad optativa}
De forma optativa, se podrá incluir cualquier funcionalidad relevante en el contexto de la asignatura. Se valorarán especialmente las funcionalidades que impliquen el uso de técnicas nuevas, o de aspectos de Django no utilizados en los ejercicios previos, y que tengan sentido en el contexto de esta práctica y de la asignatura.
En el formulario de entrega se pide que se justifique por qué se considera funcionalidad optativa lo que habeis implementado. Sólo a modo de sugerencia, se incluyen algunas posibles funcionalidades optativas:
\begin{itemize}
\item Inclusión de un \emph{favicon} del sitio
\item Visualización de las páginas en formato JSON, de forma similar a como el enunciado indica para XML.
\item Generación de un canal RSS, XML libre y/o JSON para los comentarios puestos en el sitio.
\item Incorporación de datos del canal RSS de avisos de AEMET\footnote{Canales RSS de AEMET: \url{http://www.aemet.es/es/rss_info}} a la página principal y/o a otras páginas ofrecidas por la aplicación.
\item Funcionalidad para acceder a datos ofrecidos por AEMT via su API de datos abiertos\footnote{AEMET open data: \url{https://opendata.aemet.es}}
\item Funcionalidad de registro de usuarios: que la aplicación proporcione la funcionalidad de registrarse en el sitio.
\item Uso de Javascript o AJAX para algún aspecto de la práctica (por ejemplo, para seleccionar un municipio para una página de usuario).
\item Puntuación de municipios. Cada visitante (registrado o no) puede dar un ``+1'' a cualquier municipio que aparezca en el sitio. La suma de ``+'' que ha obtenido un municipio se verá cada vez que se vea el municipio en el sitio.
\item Uso de elementos HTML5 (especificar cuáles al entregar)
\item Atención al idioma indicado por el navegador. El idioma de la interfaz de usuario del planeta tendrá en cuenta lo que especifique el navegador.
\item Despliegue de la práctica en algún sitio de Internet, de forma que pueda accederse a ella. Por ejemplo, puede considerarse desplegar en un ordenador dedicado (por ejemplo, Raspberry Pi accesible directamente desde Internet), o en servicios como Google Computing Engine\footnote{GCP Engine Free: \url{https://cloud.google.com/free/}} o Heroku\footnote{Heroku Free: \url{https://www.heroku.com/free}}.
\end{itemize}
%%----------------------------------------------------------------------------
\subsection{Entrega de la práctica}
\begin{itemize}
\item \textbf{Fecha límite de entrega de la práctica:} viernes, 24 de mayo de 2019 a las 03:00 (hora española peninsular)\footnote{Entiéndase la hora como jueves por la noche, ya entrado en viernes.}
%{\bf Convocatoria de junio:} miércoles, 24 de junio de 2015 a las 23:59 (hora peninsular española).
\item \textbf{Fecha de publicación de notas de prácticas:} sábado 25 de mayo, en el aula virtual.
%{\bf Convocatoria de junio:} viernes, 26 de junio, en la plataforma Moodle.
\item \textbf{Fecha de revisión de prácticas:} martes 28 de mayo, a las 12:00. Se requerirá a algunos alumnos que asistan a la revisión {\bf en persona}; se informará de ello en el mensaje de publicación de notas.
%{\bf Convocatoria de junio:} martes, 30 de junio a las 13:30. Se requerirá a algunos alumnos que asistan a la revisión {\bf en persona}; se informará de ello en el mensaje de publicación de notas.
\end{itemize}
La entrega de la práctica consiste en {\bf rellenar un formulario} (enlazado en el Moodle de la asignatura) y en seguir las instrucciones que se describen a continuación.
\begin{enumerate}
\item El repositorio contendrá todos los ficheros necesarios para que funcione la aplicación (ver detalle más abajo). Es muy importante que el alumno haya realizado una derivación (fork) del repositorio que se indica a continuación, porque si no, la práctica no podrá ser identificada:
\url{https://gitlab.etsit.urjc.es/cursosweb/practicas/server/final-mitiempo/}
Los alumnos que no entreguen las práctica de esta forma serán considerados como no presentados en lo que a la entrega de prácticas se refiere. Los que la entreguen podrán ser llamados a realizar también una entrega presencial, que tendrá lugar en la fecha y hora de la revisión. Esta entrega presencial podrá incluir una conversación con el profesor sobre cualquier aspecto de la realización de la práctica.
Recordad que es importante ir haciendo commits de vez en cuando y que sólo al hacer push estos commits son públicos. Antes de entregar la práctica, haced un push. Y cuando la entreguéis y sepáis el nombre del repositorio, podéis cambiar el nombre del repositorio desde el interfaz web de GitLab.
\item Un vídeo de demostración de la parte obligatoria, y otro vídeo de demostración de la parte opcional, si se han realizado opciones avanzadas. Los vídeos serán de una {\bf duración máxima de 3 minutos} (cada uno), y consistirán en una captura de pantalla de un navegador web utilizando la aplicación, y mostrando lo mejor posible la funcionalidad correspondiente (básica u opcional). Siempre que sea posible, el alumno comentará en el audio del vídeo lo que vaya ocurriendo en la captura. Los vídeos se colocarán en algún servicio de subida de vídeos en Internet (por ejemplo, Vimeo, Twitch, o YouTube). Los vídeos de más de tres minutos tendrán penalización.
Hay muchas herramientas que permiten realizar la captura de pantalla. Por ejemplo, en GNU/Linux puede usarse Gtk-RecordMyDesktop o Istanbul (ambas disponibles en Ubuntu). OBS Studio\footnote{OBS Studio: \url{https://obsproject.com/}} está disponible para varias plataformas (Linux, Windows, MacOS). Es importante que la captura sea realizada de forma que se distinga razonablemente lo que se grabe en el vídeo.
En caso de que convenga editar el vídeo resultante (por ejemplo, para eliminar tiempos de espera) puede usarse un editor de vídeo, pero siempre deberá ser indicado que se ha hecho tal cosa con un comentario en el audio, o un texto en el vídeo. Hay muchas herramientas que permiten realizar esta edición. Por ejemplo, en GNU/Linux puede usarse OpenShot o PiTiVi.
\item Se han de entregar los siguientes ficheros:
\begin{itemize}
\item Un fichero README.md que resuma las mejoras, si las hay, y explique cualquier peculiaridad de la entrega (ver siguiente punto).
\item El repositorio en el GitLab de la ETSIT deberá contener un proyecto Django completo y listo para funcionar en el entorno del laboratorio, incluyendo la base de datos con datos suficientes como para poder probarlo. Estos datos incluirán al menos dos usuarios con sus datos correspondientes, con al menos seis municipios en su página personal, al menos 12 municipios distintos seleccionados, y con al menos cinco comentarios en total.
\item Cualquier biblioteca Python que pueda hacer falta para que la aplicación funcione, junto con los ficheros auxiliares que utilice, si es que los utiliza.
\end{itemize}
\item Se incluirán en el fichero README.md los siguientes datos (la mayoría de estos datos se piden también en el formulario que se ha de rellenar para entregar la práctica - se recomienda hacer un corta y pega de estos datos en el formulario):
\begin{itemize}
\item Nombre y titulación.
\item Nombre de su cuenta en el laboratorio del alumno.
\item Resumen de las peculiaridades que se quieran mencionar sobre lo implementado en la parte obligatoria.
\item Lista de funcionalidades opcionales que se hayan implementado, y breve descripción de cada una.
\item URL del vídeo demostración de la funcionalidad básica
\item URL del vídeo demostración de la funcionalidad optativa, si se ha realizado funcionalidad optativa
\item Cuenta (login) y contraseña de los usuarios que están dados de alta en la aplicación.
\item URL de la aplicación desplegada (si es que se ha desplegado)
\end{itemize}
Asegúrate de que las URLs incluidas en este fichero están adecuadamente escritas en Markdown, de forma que la versión HTML que genera GitLab los incluya como enlaces ``pinchables''.
\end{enumerate}
%%----------------------------------------------------------------------------
\subsection{Notas y comentarios}
La práctica deberá funcionar en el entorno GNU/Linux (Ubuntu) del laboratorio de la asignatura con la versión de Django que se ha usado en prácticas.
La práctica deberá funcionar desde el navegador Firefox disponible en el laboratorio de la asignatura.
Los canales (feeds) RSS que produce la aplicación web realizada en la práctica deberán funcionar al menos con el navegador Firefox (considerándolos como canales RSS) disponibles en el laboratorio. Los documentos XML deberán ser correctos desde el punto de vista de la sintaxis XML, y por lo tanto reconocibles por un reconocedor XML, como por ejemplo el del módulo xml.sax de Python. Los documentos JSON generados deberán ser correctos desde el punto de vista de la sintaxis JSON, y por lo tanto reconocibles por un reconocedor JSON, como por ejemplo el del módulo json de Python
%%----------------------------------------------------------------------------
\subsection{Preguntas y respuestas}
A continuación, algunas preguntas relacionadas con el enunciado de esta práctica, junto con sus respuestas:
\begin{itemize}
\item ¿Es necesario utilizar los mecanismos provistos por Django para el control de sesiones y autenticación?
En principio, esa es la solución recomendada. El principal problema suele ser asegurarse de que cuaquier mecanismo alternativo funciona al menos tan bien como el de Django, lo que no es en general trivial. De todas formas, salvo muy buenos motivos, la aplicación es una aplicación Django, y por lo tanto cuantas más facilidades de Django se usen (bien usadas), mejor.
\item ¿Puedo guardar en la base de datos los datos referentes a latitud, altitud, etc (datos que no varian nunca) y precipitación, temperatura, descripción, etc y cambiarlos cuando sea necesario (ya que estos si cambian)?
Pueden almacenarse en tablas en la base de datos los datos correspondientes a poblaciones que han sido seleccionadas por al menos un usuario. En otras palabras, cada vez que un usuario seleccione un municipio, puedes guardar en una tabla en la base de datos los datos sobre ese municipio (includos latitud y longitud). Pero no puedes analizar todos los municipios que hay en el fichero JSON e incorporar su información a la base de datos.
La información sobre un municipio que puedas almacenar en la base de datos deberá actualizarse cuando se acceda al fichero XML para ese municipio, según indica el enunciado (por ejemplo, porque un usuario selecciona ese municipio, o porque hay un acceso a su página de municipio).
\item Los archivos CSS que pueden modificar los usuarios, ¿dónde y cómo debemos guardarlos?
La forma recomendada de hacerlo es mediante plantillas:
\begin{itemize}
\item En el directorio de plantillas incluirías una para la hoja CSS del sitio. Esa plantilla tendría como variables de plantilla los valores que quieras que los usuarios puedan cambiar (color de tipo de letra, tamaño de tipo de letra, etc.).
\item Además, para cada usuario, tendrás una tabla donde se almacenarán los valores para ese usuario (normalmente, una fila de la tabla por usuario).
\item Tendrás una vista en views.py que se encargará de generar la hoja CSS a partir de la plantilla. Esa vista es la que comprobará si la petición que está atendiendo corresponde a un usuario (en cuyo caso tendrá que obtener los valores para ese usuario de la tabla anterior), o no (en cuyo caso usará valores por defecto). Con los valores que obtenga, generará la hoja CSS a partir de la plantilla anterior.
\item Por último, en urls.py tendrás una línea para indicar que si te piden el recurso que sirve la hoja de estilo, llamas a la vista anterior.
\end{itemize}
\item ¿Qué partes de la página tiene que modificar el CSS ``customizable'' del usuario? En el enunciado de la práctica dice ``se usarán hojas CSS para cambiar al menos el tamaño y color de la letra, y el color del fondo, para los elementos marcados con un id, tal y como se especifica en el apartado anterior''. En el ``apartado anterior'' lo que se especifica es que el banner, caja de login, menú y pie de página tienen que ir cada uno en un elemento div con una id. ¿Significa esto que el CSS que personaliza el usuario se aplica solo a esos cuatro elementos, o aplica a toda la página? ¿En el caso de ser a cada uno de los cuatro elementos, debería el usuario poder modificar el color y letra de cada uno de ellos por separado, o aplicaría para los cuatro el mismo estilo?
Creemos que el enunciado no es ambiguo. Debe haber, por un lado, estilos CSS que afecten, como mínimo, al tamaño y color de la letra, y al color de fondo, de los elementos que es obligatorio marcar con un id, según indica el enunciado (efectivamente, el banner, la caja de login, etc.) Pueden llevar todos los mismos valores, o valores diferentes, como quiera quien realice la práctica, pero los estilos tienen que estar aplicados específicamente a esos ids.
Por otro lado, el usuario puede especificar unos cuantos valores para toda la página (según indica el enunciado: ``Un formulario para cambiar el estilo CSS de todo el sitio para ese usuario. Bastará con que se pueda cambiar el tamaño y el color de la letra y el color de fondo. Si se cambian estos valores, quedará cambiado el documento CSS que utilizarán todas las páginas del sitio para este usuario.`` Esto es, al indicar en el formulario valores para lo que puede personalizar el usuario (como mínimo el color de la letra y el color de fondo) estos valores se cambiarán para todo el sitio. Este color de letra y de fondo pueden aplicarse a todos los elementos que se muestren en el sitio, o sólo a algunos de ellos (por ejemplo, a todos los que no se ven afectados por los id mencionados anteriormente), según quiera el alumno. Lo importante es que el cambio afecte, en los elementos que se vean afectados, a todas las páginas del sitio. Naturalmente, si se decide cambiar por ejemplo la apariencia de todos los elementos del sitio, eso afectará también a los que tengan id Por eso quizás no sea una buena idea cambiar también estos elementos, desde el punto de vista estético, dado que quizás sea mejor que aparezcan con u color de letra y/o de fondo diferente. Pero eso queda como decisión del alumno.
\item Si decido trabajar en la opción de despliegue de la aplicación, ¿dónde puedo realizar este despliegue?
El despliegue puede realizarse en caulquier ordenador que esté conectado permanentemente a Internet durante el periodo de correción, en una dirección accesible desde cualquier navegador conectado a su vez a Internet. Esto puede ser por ejemplo un ordenador personal en un domicilio con acceso permanente a Intener, adecaudamente configurado (puede ser una Raspberry Pi o similar, si se busca una solución simple y de bajo coste). También puede ser un servicio en Internet, por ejemplo uno gratuito como los que ofrecen Google (instrucciones\footnote{GCP Quickstart Using a Linux VM:\\ \url{https://cloud.google.com/compute/docs/quickstart-linux}}, precios\footnote{Google Compute Engine Pricing:\\ \url{https://cloud.google.com/compute/pricing}}), Heroku (instrucciones\footnote{Heroku Deploying with Git:\\ \url{https://devcenter.heroku.com/categories/deploying-with-git}}, características\footnote{Heroku Free Dyno Hours:\\ \url{https://devcenter.heroku.com/articles/free-dyno-hours}}) o PythonAmywhere (instrucciones\footnote{Capítulo ``Deploy!'' de Django Girls Tutorial:\\ \url{https://tutorial.djangogirls.org/en/deploy/}}, precios\footnote{PythonAnywhere Plans and Pricing:\\ \url{https://www.pythonanywhere.com/pricing/}}).
\item Para las URLs de los documentos XML que ofrece MiTiempo, ¿puedo usar la terminación \verb|format=xml| en lugar de \verb|?format=xml| ?
Sí. Debido a un error, los primeros enunciados mencionaban la terminación \verb|format=xml| para estos ficheros. Por ello, el alumno puede elegir entre servirlos con ese nombre de recurso, o con el que indica la versión final del enunciado, \verb|?format=xml|. Si aún no se ha realizado la implementación de ninguna de las dos formas, se recomienda hacerlo como indica el enunciado definitivo, porque eso permitirá utilizar la misma vista (view) que se utiliza para el documento HTML correspondiente, simplemente comprobando si la petición incluye una ``query string'' (utilizando los mecanismos pertinentes de Django). Pero como se ha dicho, si el alumno prefiere implementarlo de la otra forma, se considerara de la misma manera.
\end{itemize}
%%----------------------------------------------------------------------------
%%----------------------------------------------------------------------------
\section{Proyecto final (2019, junio)}
\label{practica-final-2019-06}
El proyecto final para la convocatoria de junio de 2019 será la misma que la descrita para la convocatoria de mayo de 2019, con las siguientes consideraciones:
\begin{itemize}
\item En vez de ``\emph{La página principal se ofrece rá también como un documento XML, que incluirá la misma lista de municipios, y un enlace al fichero XML que proporciona para cada uno de ellos la AEMET. Este documento se ofrecerá cuando se pida la URL de municipios, concatenando al final} \verb|?format=xml|' ahora será ``\emph{La página principal se ofrecerá también como un documento JSON, que incluirá la misma lista de municipios, y un enlace al fichero XML que proporciona para cada uno de ellos la AEMET. Este documento se ofrecerá cuando se pida la URL de municipios, concatenando al final} \verb|?format=json|''.
\item En vez de ``\emph{Mostrará un listado de los 10 municipios con más comentarios. Si no hubiera 10 municipios con comentarios, se mostrarán sólo los que tengan comentarios}'' ahora será ``\emph{Mostrará un listado de los 10 municipios más seleccionados por los usuarios. Si no hubiera 10 municipios seleccionados, se mostrarán sólo los que se hayan seleccionado}''.
\end{itemize}
Las fechas de entrega, publicación y revisión de esta convocatoria quedan como siguen:
\begin{itemize}
\item \textbf{Fecha límite de entrega de la práctica:} lunes, 1 de julio de 2019 a las 05:00 (hora española peninsular)\footnote{Entiéndase la hora como domingo por la noche, ya entrado el lunes.}.
\item \textbf{Fecha de publicación de notas:} miércoles, 3 de julio de 2019, en la plataforma Moodle.
\item \textbf{Fecha de revisión:} viernes, 5 de julio de 2019 a las 10:00.
\end{itemize}
\newpage
\newpage
%%----------------------------------------------------------------------------
%%----------------------------------------------------------------------------
\section{Proyecto final (2018, mayo)}
\label{practica-final-2018-05}
El proyecto final de la asignatura consiste en la creación de una aplicación web que aglutine información sobre museos de la ciudad de Madrid. A continuación se describe el funcionamiento y arquitectura general de la aplicación, la funcionalidad mínima que debe proporcionar, y otra funcionalidad optativa que podrá tener.
La aplicación se encargará de descargar información sobre los mencionados museos, disponibles públicamente en varios formatos en el portal de datos abiertos de Madrid, y de ofrecerlos a los usuarios para que puedan seleccionar los que les parezca más interesantes, y comentar sobre ellos. De esta manera, un escenario típico es el de un usuario que a partir de los museos disponibles, elija los que le parezca más adecuados, y comente sobre los que quiera.
%%----------------------------------------------------------------------------
\subsection{Arquitectura y funcionamiento general}
Arquitectura general:
\begin{itemize}
\item La práctica se construirá como un proyecto Django/Python3, que incluirá una o varias aplicaciones Django que implementen la funcionalidad requerida.
\item Para el almacenamiento de datos persistente se usará SQLite3, con tablas definidas en modelos de Django.
\item Se usará la aplicación Django ``Admin Site'' para crear cuenta a los usuarios en el sistema, y para la gestión general de las bases de datos necesarias. Todas las bases de datos que contenga la aplicación tendrá que ser accesible vía este ``Admin Site''.
\item Se utilizarán plantillas Django (a ser posible, una jerarquía de plantillas, para que la práctica tenga un aspecto similar) para definir las páginas que se servirán a los navegadores de los usuarios. Estas plantillas incluirán en todas las páginas al menos:
\begin{itemize}
\item Un \emph{banner} (imagen) del sitio, en la parte superior izquierda.
\item Una caja para entrar (hacer login en el sitio), o para salir (si ya se ha entrado).
\begin{itemize}
\item En caso de que no se haya entrado en una cuenta, esta caja permitirá al visitante introducir su identificador de usuario y su contraseña.
\item En caso de que ya se haya entrado, esta caja mostrará el identificador del usuario y permitirá salir de la cuenta (logout). Esta caja aparecerá en la parte superior derecha.
\end{itemize}
\item Un menú de opciones, como barra, debajo de los dos elementos anteriores (banner y caja de entrada o salida).
\item Un pie de página con una nota de atribución, indicando ``Esta aplicación utiliza datos del portal de datos abiertos de la ciudad de Madrid'', y un enlace a la página con los datos, y a la descripción de los mismos (ver enlaces más abajo).
\end{itemize}
Cada una de estas partes estará marcada con propiedades ``id'' en HTML, para poder ser referenciadas en hojas de estilo CSS.
\item Se utilizarán hojas de estilo CSS para determinar la apariencia de la práctica. Estas hojas definirán al menos el color y el tamaño de la letra, y el color de fondo de cada una de las partes (elementos) marcadas con id que se indican en el apartado anterior.
\item Se utilizará, para componer la información sobre museos, la disponible en el portal de datos abiertos de la ciudad de Madrid:
\item Fichero con los datos abiertos de museos proporcionado por el Ayuntamiento de Madrid: \\
\url{https://datos.madrid.es/portal/site/egob/menuitem.c05c1f754a33a9fbe4b2e4b284f1a5a0/?vgnextoid=118f2fdbecc63410VgnVCM1000000b205a0aRCRD&vgnextchannel=374512b9ace9f310VgnVCM100000171f5a0aRCRD&vgnextfmt=default}
\item Copia del fichero anterior en el repositorio CursosWeb/Code de GitHub: \\
\url{https://github.com/CursosWeb/CursosWeb.github.io/tree/master/etc}
\end{itemize}
Funcionamiento general:
\begin{itemize}
\item Los usuarios serán dados de alta en la práctica mediante el módulo ``Admin Site'' de Django. Una vez estén dados de alta, serán considerados ``usuarios registrados''.
\item El listado de museos se cargará a partir del fichero XML cuando un usuario indique que se carguen. Hasta que algún usuario indique por primera vez que se carguen los datos, no habrá listado de museos en la base de datos te la aplicación.
\item Los usuarios registrados podrán crear su selección de museos. Para ello, dispondrán de una página personal. Llamaremos a esta página la ``página del usuario''.
\item La selección de museos en su página personal la realizará cada usuario a partir de información sobre museos ya disponibles en el sitio.
\item Cualquier navegador podrá acceder a la interfaz pública del sitio, que ofrecerá la página personal de cada usuario, para todos los usuarios del sitio.
\item Cualquier usuario podrá indicar que quiere una vista del sitio que incluya sólo los museos (los que en XML tienen el atributo de nombre ``Accesibilidad'' con valor ``1'').
\end{itemize}
%%----------------------------------------------------------------------------
\subsection{Funcionalidad mínima}
Los museos se obtendrán a partir de la información pública ofrecida por el Ayuntamiento de Madrid en el Portal de Datos Abiertos, en forma de ficheros XML, como se indicaba anteriormente.
La {\bf interfaz pública} contiene los recursos a servir como páginas HTML completas (pensadas para ser vistas en el navegador) para cualquier visitante (sea usuario registrado o no):
\begin{itemize}
\item /: Página principal de la práctica. Constará de un listado de museos y otro con enlaces a páginas personales:
\begin{enumerate}
\item Mostrará un listado de los cinco museos con más comentarios. Si no hubiera 5 museos con comentarios, se mostrarán sólo los que tengan comentarios. Para cada museo, incluirá información sobre:
\begin{itemize}
\item su nombre (que será un enlace que apuntará a la URL del museo en el portal esmadrid),
\item su dirección,
\item y un enlace, ``Más información'', que apuntará a la página del museo en la aplicación (ver más adelante).
\end{itemize}
\item También se mostrará un listado, en una columna lateral, con enlaces a las páginas personales disponibles. Para cada página personal mostrará el título que le haya dado su usuario (como un enlace a la página personal en cuestión) y el nombre del usuario. Si a una página personal aún no se le hubiera puesto título, este título será ``Página de usuario'', donde ``usuario'' es el identificador de usuario del usuario en cuestión.
\item Tambień se mostrará un botón, que al pulsarlo se pasará a ver en todos los listados los museos accesibles, y sólo estos. Si se vuelve a pulsar, se volverán a ver todos los museos.
\end{enumerate}
\item /{usuario}: Página personal de un usuario. Si la URL es ``/usuario'', es que corresponde al usuario ``usuario''. Mostrará los museos seleccionados por ese usuario (aunque no puede haber más de 5 a la vez; si hay más debería haber un enlace para mostrar las 5 siguientes y así en adelante, siempre de 5 en 5). Para cada museo se mostrará la misma información que en la página principal. Además, para cada museo se deberá mostrar la fecha en la que fue seleccionada por el usuario.
\item /museos: Página con todos los museos. Para cada uno de ellos aparecerá sólo el nombre, y un enlace a su página. En la parte superior de la página, existirá un formulario que permita filtrar estos museos según el distrito. Para poder filtrar por distrito, se buscará en la base de datos cuáles son los distritos con museos.
\item /museos/{id}: Página de un museo en la aplicación. Mostrará toda la información razonablemente posible de XML del portal de datos abierto del Ayuntamiento de Madrid, incluyendo al menos la que se menciona en otros apartados de este enunciado, la dirección, la descripción, si es accesible o no, el barrio y el distrito, y los datos de contacto. Además, se mostrarán todos los comentarios que se hayan puesto para este museo.
\item /{usuario}/xml: Canal XML para los museos seleccionados por ese usuario. El documento XML tendrá una entrada para cada museo seleccionado por el usuario, y tendrá una estructura similar (pero no necesariamente igual) a la del fichero XML del portal del Ayuntamiento.
\item /about: Página con información en HTML indicando la autoría de la práctica, explicando su funcionamiento.
\end{itemize}
Todas las páginas de la interfaz pública incluirán un menú desde el que se podrá acceder a todos los museos (URL /museos) con el texto ``Todos'' y a la ayuda (URL /about) con el texto ``About''. Todas las página que no sean la principal tendrán otra opción de menú para la URL /, con el texto ``Inicio''.
La {\bf interfaz privada} contiene los recursos a servir como páginas HTML completas para usuarios registrados (una vez se han autenticado):
\begin{itemize}
\item Todos los recursos de la interfaz pública.
\item /museos/{id}: Además de la información que se muestra de manera pública:
\begin{enumerate}
\item Un formulario para poner comentarios sobre este museo. Los comentarios serán anónimos, pero sólo se podrán poner por los usuarios registrados, una vez se han autenticado. Por tanto, bastará con que este formulario esté compuesto por una caja de texto, donde se podrá escribir el comentario, y un botón para enviarlo.
\end{enumerate}
\item /{usuario}: Además de la información que se muestra de manera pública:
\begin{enumerate}
\item Un formulario para cambiar el estilo CSS de todo el sitio para ese usuario. Bastará con que se pueda cambiar el tamaño de la letra y el color de fondo. Si se cambian estos valores, quedará cambiado el documento CSS que utilizarán todas las páginas del sitio para este usuario. Este cambio será visible en cuanto se suba la nueva página CSS.
\item Un formulario para elegir el título de su página personal.
\end{enumerate}
\end{itemize}
%Si es preciso, se añadirán más recursos (pero sólo si es realmente preciso) para poder satisfacer los requisitos especificados.
Dados los recursos mencionados anteriormente, no se permitirán los nombres de usuario ``museos'' ni ``about'' (pero no hay que hacer ninguna comprobación para esto: se asume que no se darán de alta esos usuarios en el Admin Site).
%%----------------------------------------------------------------------------
\subsection{Funcionalidad optativa}
De forma optativa, se podrá incluir cualquier funcionalidad relevante en el contexto de la asignatura. Se valorarán especialmente las funcionalidades que impliquen el uso de técnicas nuevas, o de aspectos de Django no utilizados en los ejercicios previos, y que tengan sentido en el contexto de esta práctica y de la asignatura.
En el formulario de entrega se pide que se justifique por qué se considera funcionalidad optativa lo que habeis implementado. Sólo a modo de sugerencia, se incluyen algunas posibles funcionalidades optativas:
\begin{itemize}
\item Inclusión de un \emph{favicon} del sitio
\item Generación de un canal XML para los contenidos que se muestran en la página principal.
\item Generación de canales, pero con los contenidos en JSON
\item Generación de un canal RSS para los comentarios puestos en el sitio.
\item Funcionalidad para leer los datos del Ayuntamiento en otros formatos diferentes a XML: CSV, JSON...
\item Funcionalidad de registro de usuarios
\item Uso de Javascript o AJAX para algún aspecto de la práctica (por ejemplo, para seleccionar un museo para una página de usuario).
\item Puntuación de museos. Cada visitante (registrado o no) puede dar un ``+1'' a cualquier museo del sitio. La suma de ``+'' que ha obtenido un museo se verá cada vez que se vea el museo en el sitio.
\item Uso de elementos HTML5 (especificar cuáles al entregar)
\item Atención al idioma indicado por el navegador. El idioma de la interfaz de usuario del planeta tendrá en cuenta lo que especifique el navegador.
\end{itemize}
%%----------------------------------------------------------------------------
\subsection{Entrega de la práctica}
\begin{itemize}
\item \textbf{Fecha límite de entrega de la práctica:} lunes, 21 de mayo de 2018 a las 03:00 (hora española peninsular)\footnote{Entiéndase la hora como domingo por la noche, ya entrado en lunes.}
%{\bf Convocatoria de junio:} miércoles, 24 de junio de 2015 a las 23:59 (hora peninsular española).
\item \textbf{Fecha de publicación de notas:} miércoles, 23 de mayo de 2018, en la plataforma Moodle.
%{\bf Convocatoria de junio:} viernes, 26 de junio, en la plataforma Moodle.
\item \textbf{Fecha de revisión:} jueves, 24 de mayo de 2018 a las 13:00.
%{\bf Convocatoria de junio:} martes, 30 de junio a las 13:30. Se requerirá a algunos alumnos que asistan a la revisión {\bf en persona}; se informará de ello en el mensaje de publicación de notas.
\end{itemize}
La entrega de la práctica consiste en rellenar un formulario (enlazado en el Moodle de la asignatura) y en seguir las instrucciones que se describen a continuación.
\begin{enumerate}
\item El repositorio contendrá todos los ficheros necesarios para que funcione la aplicación (ver detalle más abajo). Es muy importante que el alumno haya realizado un fork del repositorio que se indica a continuación, porque si no, la práctica no podrá ser identificada:
\url{https://github.com/CursosWeb/X-Serv-Practica-Museos}
Los alumnos que no entreguen las práctica de esta forma serán considerados como no presentados en lo que a la entrega de prácticas se refiere. Los que la entreguen podrán ser llamados a realizar también una entrega presencial, que tendrá lugar en la fecha y hora de la revisión. Esta entrega presencial podrá incluir una conversación con el profesor sobre cualquier aspecto de la realización de la práctica.
Recordad que es importante ir haciendo commits de vez en cuando y que sólo al hacer push estos commits son públicos. Antes de entregar la práctica, haced un push. Y cuando la entreguéis y sepáis el nombre del repositorio, podéis cambiar el nombre del repositorio desde el interfaz web de GitHub.
\item Un vídeo de demostración de la parte obligatoria, y otro vídeo de demostración de la parte opcional, si se han realizado opciones avanzadas. Los vídeos serán de una {\bf duración máxima de 3 minutos} (cada uno), y consistirán en una captura de pantalla de un navegador web utilizando la aplicación, y mostrando lo mejor posible la funcionalidad correspondiente (básica u opcional). Siempre que sea posible, el alumno comentará en el audio del vídeo lo que vaya ocurriendo en la captura. Los vídeos se colocarán en algún servicio de subida de vídeos en Internet (por ejemplo, Vimeo o YouTube). Los vídeos de más de tres minutos tendrán penalización.
Hay muchas herramientas que permiten realizar la captura de pantalla. Por ejemplo, en GNU/Linux puede usarse Gtk-RecordMyDesktop o Istanbul (ambas disponibles en Ubuntu). Es importante que la captura sea realizada de forma que se distinga razonablemente lo que se grabe en el vídeo.
En caso de que convenga editar el vídeo resultante (por ejemplo, para eliminar tiempos de espera) puede usarse un editor de vídeo, pero siempre deberá ser indicado que se ha hecho tal cosa con un comentario en el audio, o un texto en el vídeo. Hay muchas herramientas que permiten realizar esta edición. Por ejemplo, en GNU/Linux puede usarse OpenShot o PiTiVi.
\item Se han de entregar los siguientes ficheros:
\begin{itemize}
\item Un fichero README.md que resuma las mejoras, si las hay, y explique cualquier peculiaridad de la entrega (ver siguiente punto).
\item El repositorio GitHub deberá contener un proyecto Django completo y listo para funcionar en el entorno del laboratorio, incluyendo la base de datos con datos suficientes como para poder probarlo. Estos datos incluirán al menos dos usuarios con sus datos correspondientes, con al menos cinco museos en su página personal, y con al menos cinco comentarios en total.
\item Cualquier biblioteca Python que pueda hacer falta para que la aplicación funcione, junto con los ficheros auxiliares que utilice, si es que los utiliza.
\end{itemize}
\item Se incluirán en el fichero README.md los siguientes datos (la mayoría de estos datos se piden también en el formulario que se ha de rellenar para entregar la práctica - se recomienda hacer un corta y pega de estos datos en el formulario):
\begin{itemize}
\item Nombre y titulación.
\item Nombre de su cuenta en el laboratorio del alumno.
\item Nombre de usuario en GitHub.
\item Resumen de las peculiaridades que se quieran mencionar sobre lo implementado en la parte obligatoria.
\item Lista de funcionalidades opcionales que se hayan implementado, y breve descripción de cada una.
\item URL del vídeo demostración de la funcionalidad básica
\item URL del vídeo demostración de la funcionalidad optativa, si se ha realizado funcionalidad optativa
\end{itemize}
Asegúrate de que las URLs incluidas en este fichero están adecuadamente escritas en Markdown, de forma que la versión HTML que genera GitHub los incluya como enlaces ``pinchables''.
\end{enumerate}
%%----------------------------------------------------------------------------
\subsection{Notas y comentarios}
La práctica deberá funcionar en el entorno GNU/Linux (Ubuntu) del laboratorio de la asignatura con la versión de Django que se ha usado en prácticas.
La práctica deberá funcionar desde el navegador Firefox disponible en el laboratorio de la asignatura.
Los canales (feeds) RSS que produce la aplicación web realizada en la práctica deberán funcionar al menos con el navegador Firefox (considerándolos como canales RSS) disponibles en el laboratorio. Los documentos XML deberán ser correctos desde el punto de vista de la sintaxis XML, y por lo tanto reconocibles por un reconocedor XML, como por ejemplo el reconocedor del módulo xml.sax de Python.
%%----------------------------------------------------------------------------
%%----------------------------------------------------------------------------
\section{Proyecto final (2018, junio)}
\label{practica-final-2018-06}
El proyecto final para la convocatoria de junio de 2018 será la misma que la descrita para la convocatoria de mayo de 2018, con las siguientes consideraciones:
\begin{itemize}
\item En vez de /{usuario}/xml: Canal XML para los museos seleccionados por ese usuario, se ofrecerá el canal en formato JSON. El documento JSON tendrá una entrada para cada museo seleccionado por el usuario, y tendrá una estructura similar (pero no necesariamente igual) a la del fichero JSON del portal del Ayuntamiento.
\item La página principal no mostrará los cinco museos más comentados, sino que mostrará los cinco museos más seleccionados por usuarios para sus páginas personales.
\end{itemize}
Las fechas de entrega, publicación y revisión de esta convocatoria quedan como siguen:
\begin{itemize}
\item \textbf{Fecha límite de entrega de la práctica:} viernes, 28 de junio de 2018 a las 05:00 (hora española peninsular)\footnote{Entiéndase la hora como jueves por la noche, ya entrado el viernes.}.
%{\bf Convocatoria de junio:} miércoles, 24 de junio de 2015 a las 23:59 (hora peninsular española).
\item \textbf{Fecha de publicación de notas:} domingo, 1 de julio de 2018, en la plataforma Moodle.
%{\bf Convocatoria de junio:} viernes, 26 de junio, en la plataforma Moodle.
\item \textbf{Fecha de revisión:} martes, 3 de julio de 2018 a las 12:00.
%{\bf Convocatoria de junio:} martes, 30 de junio a las 13:30. Se requerirá a algunos alumnos que asistan a la revisión {\bf en persona}; se informará de ello en el mensaje de publicación de notas.
\end{itemize}
\newpage
\newpage
%%----------------------------------------------------------------------------
%%----------------------------------------------------------------------------
\section{Proyecto final (2017, mayo)}
\label{practica-final-2017-05}
El proyecto final de la asignatura consiste en la creación de una aplicación web que aglutine información sobre aparcamientos en la ciudad de Madrid. A continuación se describe el funcionamiento y arquitectura general de la aplicación, la funcionalidad mínima que debe proporcionar, y otra funcionalidad optativa que podrá tener.
La aplicación se encargará de descargar información sobre los mencionados aparcamientos, disponibles públicamente en formato XML en el portal de datos abiertos de Madrid, y de ofrecerlos a los usuarios para que puedan seleccionar los que les parezca más interesantes, y comentar sobre ellos. De esta manera, un escenario típico es el de un usuario que a partir de los aparcamientos disponibles, elija los que le parezca más adecuados, y comente sobre los que quiera.
%%----------------------------------------------------------------------------
\subsection{Arquitectura y funcionamiento general}
Arquitectura general:
\begin{itemize}
\item La práctica se construirá como un proyecto Django/Python3, que incluirá una o varias aplicaciones Django que implementen la funcionalidad requerida.
\item Para el almacenamiento de datos persistente se usará SQLite3, con tablas definidas en modelos de Django.
\item Se usará la aplicación Django ``Admin Site'' para crear cuenta a los usuarios en el sistema, y para la gestión general de las bases de datos necesarias. Todas las bases de datos que contenga la aplicación tendrá que ser accesible vía este ``Admin Site''.
\item Se utilizarán plantillas Django (a ser posible, una jerarquía de plantillas, para que la práctica tenga un aspecto similar) para definir las páginas que se servirán a los navegadores de los usuarios. Estas plantillas incluirán en todas las páginas al menos:
\begin{itemize}
\item Un \emph{banner} (imagen) del sitio, en la parte superior izquierda.
\item Una caja para entrar (hacer login en el sitio), o para salir (si ya se ha entrado).
\begin{itemize}
\item En caso de que no se haya entrado en una cuenta, esta caja permitirá al visitante introducir su identificador de usuario y su contraseña.
\item En caso de que ya se haya entrado, esta caja mostrará el identificador del usuario y permitirá salir de la cuenta (logout). Esta caja aparecerá en la parte superior derecha.
\end{itemize}
\item Un menú de opciones, como barra, debajo de los dos elementos anteriores (banner y caja de entrada o salida).
\item Un pie de página con una nota de atribución, indicando ``Esta aplicación utiliza datos del portal de datos abiertos de la ciudad de Madrid'', y un enlace al XML con los datos, y a la descripción de los mismos (ver enlaces más abajo).
\end{itemize}
Cada una de estas partes estará marcada con propiedades ``id'' en HTML, para poder ser referenciadas en hojas de estilo CSS.
\item Se utilizarán hojas de estilo CSS para determinar la apariencia de la práctica. Estas hojas definirán al menos el color y el tamaño de la letra, y el color de fondo de cada una de las partes (elementos) marcadas con id que se indican en el apartado anterior.
\item Se utilizará, para componer la información sobre aparcamientos disponibles, la disponible en el portal de datos abiertos de la ciudad de Madrid:
\item Fichero con los datos abiertos de aparcamientos para residentes proporcionado por el Ayuntamiento de Madrid: \\
\url{http://datos.munimadrid.es/portal/site/egob/menuitem.ac61933d6ee3c31cae77ae7784f1a5a0/?vgnextoid=00149033f2201410VgnVCM100000171f5a0aRCRD&format=xml&file=0&filename=202584-0-aparcamientos-residentes&mgmtid=e84276ac109d3410VgnVCM2000000c205a0aRCRD&preview=full}
\item Descripción del fichero: \\
\url{http://datos.madrid.es/portal/site/egob/menuitem.c05c1f754a33a9fbe4b2e4b284f1a5a0/?vgnextoid=e84276ac109d3410VgnVCM2000000c205a0aRCRD&vgnextchannel=374512b9ace9f310VgnVCM100000171f5a0aRCRD&vgnextfmt=default}
\item Copia del fichero anterior en el repositorio CursosWeb/Code de GitHub: \\
\end{itemize}
Funcionamiento general:
\begin{itemize}
\item Los usuarios serán dados de alta en la práctica mediante el módulo ``Admin Site'' de Django. Una vez estén dados de alta, serán considerados ``usuarios registrados''.
\item El listado de aparcamientos se cargará a partir del fichero XML cuando un usuario indique que se carguen. Hasta que algún usuario indique por primera vez que se carguen los datos, no habrá listado de aparcamientos en la base de datos te la aplicación.
\item Los usuarios registrados podrán crear su selección de aparcamientos. Para ello, dispondrán de una página personal. Llamaremos a esta página la ``página del usuario''.
\item La selección de aparcamientos en su página personal la realizará cada usuario a partir de información sobre aparcamientos ya disponibles en el sitio.
\item Cualquier navegador podrá acceder a la interfaz pública del sitio, que ofrecerá la página personal de cada usuario, para todos los usuarios del sitio.
\item Cualquier usuario podrá indicar que quiere una vista del sitio que incluya sólo los aparcamientos accesibles (los que en XML tienen ``accesibility'' con valor ``1'').
\end{itemize}
%%----------------------------------------------------------------------------
\subsection{Funcionalidad mínima}
Los aparcamientos se obtendrán a partir de la información pública ofrecida por el Ayuntamiento de Madrid en el Portal de Datos Abiertos, en forma de ficheros XML, como se indicaba anteriormente.
La {\bf interfaz pública} contiene los recursos a servir como páginas HTML completas (pensadas para ser vistas en el navegador) para cualquier visitante (sea usuario registrado o no):
\begin{itemize}
\item /: Página principal de la práctica. Constará de un listado de aparcamientos y otro con enlaces a páginas personales:
\begin{enumerate}
\item Mostrará un listado de los cinco aparcamientos con más comentarios. Si no hubiera 5 aparcamientos con comentarios, se mostrarán sólo los que tengan comentarios. Para cada aparcamiento, incluirá información sobre:
\begin{itemize}
\item su nombre (que será un enlace que apuntará a la url del aparcamiento en el portal esmadrid),
\item su dirección,
\item y un enlace, ``Más información'', que apuntará a la página del aparcamiento en la aplicación (ver más adelante).
\end{itemize}
\item También se mostrará un listado, en una columna lateral, con enlaces a las páginas personales disponibles. Para cada página personal mostrará el título que le haya dado su usuario (como un enlace a la página personal en cuestión) y el nombre del usuario. Si a una página personal aún no se le hubiera puesto título, este título será ``Página de usuario'', donde ``usuario'' es el identificador de usuario del usuario en cuestión.
\item Tambień se mostrará un botón, que al pulsarlo se pasará a ver en todos los listados los aparcamientos accesibles, y sólo estos. Si se vuelve a pulsar, se volverán a ver todos los aparcamientos.
\end{enumerate}
\item /{usuario}: Página personal de un usuario. Si la URL es ``/usuario'', es que corresponde al usuario ``usuario''. Mostrará los aparcamientos seleccionados por ese usuario (aunque no puede haber más de 5 a la vez; si hay más debería haber un enlace para mostrar las 5 siguientes y así en adelante, siempre de 5 en 5). Para cada aparcamiento se mostrará la misma información que en la página principal. Además, para cada aparcamiento se deberá mostrar la fecha en la que fue seleccionada por el usuario.
\item /aparcamientos: Página con todos los aparcamientos. Para cada uno de ellos aparecerá sólo el nombre, y un enlace a su página. En la parte superior de la página, existirá un formulario que permita filtrar estos aparcamientos según el distrito. Para poder filtrar por distrito, se buscará en la base de datos cuáles son los distritos con aparcamientos.
\item /aparcamientos/{id}: Página de un aparcamiento en la aplicación. Mostrará toda la información razonablemente posible de XML del portal de datos abierto del Ayuntamiento de Madrid, incluyendo al menos la que se menciona en otros apartados de este enunciado, la información de latitud y longitud, la descripción, si es accesible o no, el barrio y el distrito, y los datos de contacto. Además, se mostrarán todos los comentarios que se hayan puesto para este aparcamiento.
\item /{usuario}/xml: Canal XML para los aparcamientos seleccionados por ese usuario. El documento XML tendrá una entrada para cada aparcamiento seleccionado por el usuario, y tendrá una estructura similar (pero no necesariamente igual) a la del fichero XML del portal del Ayuntamiento.
\item /about: Página con información en HTML indicando la autoría de la práctica y explicando su funcionamiento.
\end{itemize}
Todas las páginas de la interfaz pública incluirán un menú desde el que se podrá acceder a todos los aparcamientos (URL /aparcamientos) con el texto ``Todos'' y a la ayuda (URL /about) con el texto ``About''. Todas las página que no sean la principal tendrán otra opción de menú para la URL /, con el texto ``Inicio''.
La {\bf interfaz privada} contiene los recursos a servir como páginas HTML completas para usuarios registrados (una vez se han autenticado):
\begin{itemize}
\item Todos los recursos de la interfaz pública.
\item /aparcamientos/{id}: Además de la información que se muestra de manera pública:
\begin{enumerate}
\item Un formulario para poner comentarios sobre este aparcamiento. Los comentarios serán anónimos, pero sólo se podrán poner por los usuarios registrados, una vez se han autenticado. Por tanto, bastará con que este formulario esté compuesto por una caja de texto, donde se podrá escribir el comentario, y un botón para enviarlo.
\end{enumerate}
\item /{usuario}: Además de la información que se muestra de manera pública:
\begin{enumerate}
\item Un formulario para cambiar el estilo CSS de todo el sitio para ese usuario. Bastará con que se pueda cambiar el tamaño de la letra y el color de fondo. Si se cambian estos valores, quedará cambiado el documento CSS que utilizarán todas las páginas del sitio para este usuario. Este cambio será visible en cuanto se suba la nueva página CSS.
\item Un formulario para elegir el título de su página personal.
\end{enumerate}
\end{itemize}
%Si es preciso, se añadirán más recursos (pero sólo si es realmente preciso) para poder satisfacer los requisitos especificados.
Dados los recursos mencionados anteriormente, no se permitirán los nombres de usuario ``aparcamientos'' ni ``about'' (pero no hay que hacer ninguna comprobación para esto: se asume que no se darán de alta esos usuarios en el Admin Site).
%%----------------------------------------------------------------------------
\subsection{Funcionalidad optativa}
De forma optativa, se podrá incluir cualquier funcionalidad relevante en el contexto de la asignatura. Se valorarán especialmente las funcionalidades que impliquen el uso de técnicas nuevas, o de aspectos de Django no utilizados en los ejercicios previos, y que tengan sentido en el contexto de esta práctica y de la asignatura.
En el formulario de entrega se pide que se justifique por qué se considera funcionalidad optativa lo que habeis implementado. Sólo a modo de sugerencia, se incluyen algunas posibles funcionalidades optativas:
\begin{itemize}
\item Inclusión de un \emph{favicon} del sitio
\item Generación de un canal XML para los contenidos que se muestran en la página principal.
\item Generación de canales, pero con los contenidos en JSON
\item Generación de un canal RSS para los comentarios puestos en el sitio.
\item Funcionalidad de registro de usuarios
\item Uso de Javascript o AJAX para algún aspecto de la práctica (por ejemplo, para seleccionar un aparcamiento para una página de usuario).
\item Puntuación de aparcamientos. Cada visitante (registrado o no) puede dar un ``+1'' a cualquier aparcamiento del sitio. La suma de ``+'' que ha obtenido un aparcamiento se verá cada vez que se vea el aparcamiento en el sitio.
\item Uso de elementos HTML5 (especificar cuáles al entregar)
\item Atención al idioma indicado por el navegador. El idioma de la interfaz de usuario del planeta tendrá en cuenta lo que especifique el navegador.
\end{itemize}
%%----------------------------------------------------------------------------
\subsection{Entrega de la práctica}
\begin{itemize}
\item \textbf{Fecha límite de entrega de la práctica:} miércoles, 24 de mayo de 2017 a las 03:00 (hora española peninsular)\footnote{Entiéndase la hora como miércoles por la noche, ya entrado el jueves.}
%{\bf Convocatoria de junio:} miércoles, 24 de junio de 2015 a las 23:59 (hora peninsular española).
\item \textbf{Fecha de publicación de notas:} sábado, 27 de mayo de 2017, en la plataforma Moodle.
%{\bf Convocatoria de junio:} viernes, 26 de junio, en la plataforma Moodle.
\item \textbf{Fecha de revisión:} lunes, 29 de mayo de 2017 a las 13:00.
%{\bf Convocatoria de junio:} martes, 30 de junio a las 13:30. Se requerirá a algunos alumnos que asistan a la revisión {\bf en persona}; se informará de ello en el mensaje de publicación de notas.
\end{itemize}
La entrega de la práctica consiste en rellenar un formulario (enlazado en el Moodle de la asignatura) y en seguir las instrucciones que se describen a continuación.
\begin{enumerate}
\item El repositorio contendrá todos los ficheros necesarios para que funcione la aplicación (ver detalle más abajo). Es muy importante que el alumno haya realizado un fork del repositorio que se indica a continuación, porque si no, la práctica no podrá ser identificada:
\url{https://github.com/CursosWeb/X-Serv-Practica-Aparcamientos/}
Los alumnos que no entreguen las práctica de esta forma serán considerados como no presentados en lo que a la entrega de prácticas se refiere. Los que la entreguen podrán ser llamados a realizar también una entrega presencial, que tendrá lugar en la fecha y hora de la revisión. Esta entrega presencial podrá incluir una conversación con el profesor sobre cualquier aspecto de la realización de la práctica.
Recordad que es importante ir haciendo commits de vez en cuando y que sólo al hacer push estos commits son públicos. Antes de entregar la práctica, haced un push. Y cuando la entreguéis y sepáis el nombre del repositorio, podéis cambiar el nombre del repositorio desde el interfaz web de GitHub.
\item Un vídeo de demostración de la parte obligatoria, y otro vídeo de demostración de la parte opcional, si se han realizado opciones avanzadas. Los vídeos serán de una duración máxima de 3 minutos (cada uno), y consistirán en una captura de pantalla de un navegador web utilizando la aplicación, y mostrando lo mejor posible la funcionalidad correspondiente (básica u opcional). Siempre que sea posible, el alumno comentará en el audio del vídeo lo que vaya ocurriendo en la captura. Los vídeos se colocarán en algún servicio de subida de vídeos en Internet (por ejemplo, Vimeo o YouTube).
Hay muchas herramientas que permiten realizar la captura de pantalla. Por ejemplo, en GNU/Linux puede usarse Gtk-RecordMyDesktop o Istanbul (ambas disponibles en Ubuntu). Es importante que la captura sea realizada de forma que se distinga razonablemente lo que se grabe en el vídeo.
En caso de que convenga editar el vídeo resultante (por ejemplo, para eliminar tiempos de espera) puede usarse un editor de vídeo, pero siempre deberá ser indicado que se ha hecho tal cosa con un comentario en el audio, o un texto en el vídeo. Hay muchas herramientas que permiten realizar esta edición. Por ejemplo, en GNU/Linux puede usarse OpenShot o PiTiVi.
\item Se han de entregar los siguientes ficheros:
\begin{itemize}
\item Un fichero README.md que resuma las mejoras, si las hay, y explique cualquier peculiaridad de la entrega (ver siguiente punto).
\item El repositorio GitHub deberá contener un proyecto Django completo y listo para funcionar en el entorno del laboratorio, incluyendo la base de datos con datos suficientes como para poder probarlo. Estos datos incluirán al menos dos usuarios con sus datos correspondientes, con al menos cinco aparcamientos en su página personal, y con al menos cinco comentarios en total.
\item Cualquier biblioteca Python que pueda hacer falta para que la aplicación funcione, junto con los ficheros auxiliares que utilice, si es que los utiliza.
\end{itemize}
\item Se incluirán en el fichero README.md los siguientes datos (la mayoría de estos datos se piden también en el formulario que se ha de rellenar para entregar la práctica - se recomienda hacer un corta y pega de estos datos en el formulario):
\begin{itemize}
\item Nombre y titulación.
\item Nombre de su cuenta en el laboratorio del alumno.
\item Nombre de usuario en GitHub.
\item Resumen de las peculiaridades que se quieran mencionar sobre lo implementado en la parte obligatoria.
\item Lista de funcionalidades opcionales que se hayan implementado, y breve descripción de cada una.
\item URL del vídeo demostración de la funcionalidad básica
\item URL del vídeo demostración de la funcionalidad optativa, si se ha realizado funcionalidad optativa
\end{itemize}
Asegúrate de que las URLs incluidas en este fichero están adecuadamente escritas en Markdown, de forma que la versión HTML que genera GitHub los incluya como enlaces ``pinchables''.
\end{enumerate}
%%----------------------------------------------------------------------------
\subsection{Notas y comentarios}
La práctica deberá funcionar en el entorno GNU/Linux (Ubuntu) del laboratorio de la asignatura con la versión de Django que se ha usado en prácticas.
La práctica deberá funcionar desde el navegador Firefox disponible en el laboratorio de la asignatura.
Los canales (feeds) RSS que produce la aplicación web realizada en la práctica deberán funcionar al menos con el navegador Firefox (considerándolos como canales RSS) disponibles en el laboratorio. Los documentos XML deberán ser correctos desde el punto de vista de la sintaxis XML, y por lo tanto reconocibles por un reconocedor XML, como por ejemplo el reconocedor del módulo xml.sax de Python.
%%----------------------------------------------------------------------------
%%----------------------------------------------------------------------------
\section{Proyecto final (2017, junio)}
\label{practica-final-2017-06}
El proyecto final para la convocatoria de junio de 2017 será la misma que la descrita para la convocatoria de mayo de 2017, con las siguientes consideraciones:
\begin{itemize}
\item La puntuación de aparcamientos será requisito de la práctica básica.
\item El formulario para poner comentarios deja de ser un requisito de la práctica básica.
\end{itemize}
Las fechas de entrega, publicación y revisión de esta convocatoria quedan como siguen:
\begin{itemize}
\item \textbf{Fecha límite de entrega de la práctica:} jueves, 29 de junio de 2017 a las 03:00 (hora española peninsular)\footnote{Entiéndase la hora como jueves por la noche, ya entrado el viernes.}.
%{\bf Convocatoria de junio:} miércoles, 24 de junio de 2015 a las 23:59 (hora peninsular española).
\item \textbf{Fecha de publicación de notas:} sábado, 1 de julio de 2017, en la plataforma Moodle.
%{\bf Convocatoria de junio:} viernes, 26 de junio, en la plataforma Moodle.
\item \textbf{Fecha de revisión:} lunes, 4 de julio de 2017 a las 13:00.
%{\bf Convocatoria de junio:} martes, 30 de junio a las 13:30. Se requerirá a algunos alumnos que asistan a la revisión {\bf en persona}; se informará de ello en el mensaje de publicación de notas.
\end{itemize}
\newpage
%%----------------------------------------------------------------------------
%%----------------------------------------------------------------------------
\section{Proyecto final (2016, mayo)}
\label{practica-final-2016-05}
El proyecto final de la asignatura consiste en la creación de una aplicación web que aglutine información sobre alojamientos en la ciudad de Madrid. A continuación se describe el funcionamiento y arquitectura general de la aplicación, la funcionalidad mínima que debe proporcionar, y otra funcionalidad optativa que podrá tener.
La aplicación se encargará de descargar información sobre los mencionados alojamientos, disponibles públicamente en formato XML en el portal de datos abiertos de Madrid, y de ofrecerlos a los usuarios para que puedan seleccionar los que les parezca más interesantes, y comentar sobre ellos. De esta manera, un escenario típico es el de un usuario que a partir de los alojamientos disponibles, elija los que le parezca más adecuados, y comente sobre los que quiera.
%%----------------------------------------------------------------------------
\subsection{Arquitectura y funcionamiento general}
Arquitectura general:
\begin{itemize}
\item La práctica se construirá como un proyecto Django, que incluirá una o varias aplicaciones Django que implementen la funcionalidad requerida.
\item Para el almacenamiento de datos persistente se usará SQLite3, con tablas definidas en modelos de Django.
\item Se usará la aplicación Django ``Admin Site'' para crear cuenta a los usuarios en el sistema, y para la gestión general de las bases de datos necesarias. Todas las bases de datos que contenga la aplicación tendrá que ser accesible vía este ``Admin Site''.
\item Se utilizarán plantillas Django (a ser posible, una jerarquía de plantillas, para que la práctica tenga un aspecto similar) para definir las páginas que se servirán a los navegadores de los usuarios. Estas plantillas incluirán en todas las páginas al menos:
\begin{itemize}
\item Un \emph{banner} (imagen) del sitio, en la parte superior izquierda.
\item Una caja para entrar (hacer login en el sitio), o para salir (si ya se ha entrado).
\begin{itemize}
\item En caso de que no se haya entrado en una cuenta, esta caja permitirá al visitante introducir su identificador de usuario y su contraseña.
\item En caso de que ya se haya entrado, esta caja mostrará el identificador del usuario y permitirá salir de la cuenta (logout). Esta caja aparecerá en la parte superior derecha.
\end{itemize}
\item Un menú de opciones, como barra, debajo de los dos elementos anteriores (banner y caja de entrada o salida).
\item Un pie de página con una nota de atribución, indicando ``Esta aplicación utiliza datos del portal de datos abiertos de la ciudad de Madrid'', y un enlace al XML con los datos, y a la descripción de los mismos (ver enlaces más abajo).
\end{itemize}
Cada una de estas partes estará marcada con propiedades ``id'' en HTML, para poder ser referenciadas en hojas de estilo CSS.
\item Se utilizarán hojas de estilo CSS para determinar la apariencia de la práctica. Estas hojas definirán al menos el color y el tamaño de la letra, y el color de fondo de cada una de las partes (elementos) marcadas con id que se indican en el apartado anterior.
\item Se utilizará, para componer la información sobre alojamientos disponibles, la disponible en el portal de datos abiertos de la ciudad de Madrid:
\begin{itemize}
\item Descripción: \\
\url{http://bit.ly/1T24Zsq}
\item Fichero XML con los datos (en español): \\
\url{http://www.esmadrid.com/opendata/alojamientos_v1_es.xml} \\
\url{http://cursosweb.github.io/etc/alojamientos_es.xml}
\item Fichero XML con los datos (en inglés): \\
\url{http://www.esmadrid.com/opendata/alojamientos_v1_en.xml} \\
\url{http://cursosweb.github.io/etc/alojamientos_en.xml}
\item Fichero XML con los datos (en francés): \\
\url{http://www.esmadrid.com/opendata/alojamientos_v1_fr.xml} \\
\url{http://cursosweb.github.io/etc/alojamientos_fr.xml}
\item Hay ficheros XML con los datos en otros idiomas
\end{itemize}
\end{itemize}
Funcionamiento general:
\begin{itemize}
\item Los usuarios serán dados de alta en la práctica mediante el módulo ``Admin Site'' de Django. Una vez estén dados de alta, serán considerados ``usuarios registrados''.
\item El listado de alojamientos se cargará a partir del XML con los datos en español sólo cuando un usuario indique que quiere que se carguen. Hasta que algún usuario indique por primera vez que se carguen los datos, no habrá listado de alojamientos en la base de datos te la aplicación.
\item Los usuarios registrados podrán crear su selección de alojamientos. Para ello, dispondrán de una página personal. Llamaremos a esta página la ``página del usuario''.
\item La selección de alojamientos en su página personal la realizará cada usuario a partir de información sobre alojamientos ya disponibles en el sitio.
\item Cualquier navegador podrá acceder a la interfaz pública del sitio, que ofrecerá la página personal de cada usuario, para todos los usuarios del sitio.
\item Cualquier usuario, al ver la página de alojamientos de cualquier usuario (incluido él mismo), podrá pedir verla en otro de los idiomas disponibles. En ese caso, la aplicación descargará el documento XML con el listado de alojamientos en el idioma elegido, buscará los alojamientos en cuestión, y usará sus datos para mostrar la misma página, pero con los datos sobre los alojamientos en ese idioma. La aplicación no almacenará estos datos en otro idioma en la base de datos, de forma que si se le vuelve a pedir lo mismo, volverá a descargar el fichero XML.
\end{itemize}
%%----------------------------------------------------------------------------
\subsection{Funcionalidad mínima}
Los alojamientos se obtendrán a partir de la información pública ofrecida por el Ayuntamiento de Madrid en el Portal de Datos Abiertos, en forma de ficheros XML, como se indicaba anteriormente.
La {\bf interfaz pública} contiene los recursos a servir como páginas HTML completas (pensadas para ser vistas en el navegador) para cualquier visitante (sea usuario registrado o no):
\begin{itemize}
\item /: Página principal de la práctica. Constará de un listado de alojamientos y otro con enlaces a páginas personales:
\begin{enumerate}
\item Mostrará un listado de los diez alojamientos con más comentarios. Si no hubiera 10 alojamientos con comentarios, se mostrarán sólo los que tengan comentarios. Para cada alojamiento, incluirá información sobre:
\begin{itemize}
\item su nombre (que será un enlace que apuntará a la url del alojamiento en el portal esmadrid),
\item su dirección,
\item una imagen suya en pequeño formato,
\item y un enlace, ``Más información'', que apuntará a la página del alojamiento en la aplicación (ver más adelante).
\end{itemize}
\item También se mostrará un listado, en una columna lateral derecha, con enlaces a las páginas personales disponibles. Para cada página personal mostrará el título que le haya dado su usuario (como un enlace a la página personal en cuestión) y el nombre del usuario. Si a una página personal aún no se le hubiera puesto título, este título será ``Página de usuario'', donde ``usuario'' es el identificador de usuario del usuario en cuestión.
\end{enumerate}
\item /{usuario}: Página personal de un usuario. Si la URL es ``/usuario'', es que corresponde al usuario ``usuario''. Mostrará los alojamientos seleccionados por ese usuario (aunque no puede haber más de 10 a la vez; si hay más debería haber un enlace para mostrar las diez siguientes y así en adelante, siempre de diez en diez). Para cada alojamiento se mostrará la misma información que en la página principal. Además, para cada alojamiento se deberá mostrar la fecha en la que fue seleccionada por el usuario.
\item /alojamientos: Página con todos los alojamientos. Para cada uno de ellos aparecerá sólo el nombre, y un enlace a su página. En la parte superior de la página, existirá un formulario que permita filtrar estos alojamientos según varios campos, como, por ejemplo, por su categoría (por ejemplo, ``Hoteles'') y su subcategoría (por ejemplo, ``4 estrellas'') .
\item /alojamientos/{id}: Página de un alojamiento en la aplicación. Mostrará toda la información de los elementos ``basicData'' y ``geoData'' obtenida del XML del portal de datos abierto del Ayuntamiento de Madrid. Además, se mostrarán cinco fotos entre las que se pueden obtener del mismo documento XML (o menos, si en el documento no hay tantas), y todos los comentarios que se hayan puesto para este alojamiento.
\item /{usuario}/xml: Canal XML para los alojamientos seleccionados por ese usuario. El documento XML tendrá una entrada para cada alojamiento seleccionado por el usuario, y tendrá una estructura similar (pero no necesariamente igual) a la del fichero XML del portal del Ayuntamiento.
\item /about: Página con información en HTML indicando la autoría de la práctica y explicando su funcionamiento.
\end{itemize}
Todas las páginas de la interfaz pública incluirán un menú desde el que se podrá acceder a todos los alojamientos (URL /alojamientos) con el texto ``Todos'' y a la ayuda (URL /about) con el texto ``About''. Todas las página que no sean la principal tendrán otra opción de menú para la URL /, con el texto ``Inicio''.
La {\bf interfaz privada} contiene los recursos a servir como páginas HTML completas para usuarios registrados (una vez se han autenticado):
\begin{itemize}
\item Todos los recursos de la interfaz pública.
\item /alojamientos/{id}: Además de la información que se muestra de manera pública:
\begin{enumerate}
\item Un formulario para poner comentarios sobre este alojamiento. Los comentarios serán anónimos, pero sólo se podrán poner por los usuarios registrados, una vez se han autenticado. Por tanto, bastará con que este formulario esté compuesto por una caja de texto, donde se podrá escribir el comentario, y un botón para enviarlo.
\item Un botón para cada uno de los idiomas en que está disponible el documento XML en el portal del Ayuntamiento. En caso de que el usuario pulse uno de esos botones, la aplicación descargará el XML correspondiente al idioma seleccionado, buscará en él la información sobre el alojamiento en cuestión, y si está disponible, la mostrará en pantalla en ese idioma (además de la información que ya estaba disponible). Si el alojamiento no está disponible en ese idioma, se pondrá un mensaje indicándolo. Esta información en otros idiomas no se guardará en la base de datos.
\end{enumerate}
\item /{usuario}: Además de la información que se muestra de manera pública:
\begin{enumerate}
\item Un formulario para cambiar el estilo CSS de todo el sitio para ese usuario. Bastará con que se pueda cambiar el tamaño de la letra y el color de fondo. Si se cambian estos valores, quedará cambiado el documento CSS que utilizarán todas las páginas del sitio para este usuario. Este cambio será visible en cuanto se suba la nueva página CSS.
\item Un formulario para elegir el título de su página personal.
\end{enumerate}
\end{itemize}
%Si es preciso, se añadirán más recursos (pero sólo si es realmente preciso) para poder satisfacer los requisitos especificados.
Dados los recursos mencionados anteriormente, no se permitirán los nombres de usuario ``alojamientos'' ni ``about'' (pero no hay que hacer ninguna comprobación para esto: se asume que no se darán de alta esos usuarios en el Admin Site).
%%----------------------------------------------------------------------------
\subsection{Funcionalidad optativa}
De forma optativa, se podrá incluir cualquier funcionalidad relevante en el contexto de la asignatura. Se valorarán especialmente las funcionalidades que impliquen el uso de técnicas nuevas, o de aspectos de Django no utilizados en los ejercicios previos, y que tengan sentido en el contexto de esta práctica y de la asignatura.
En el formulario de entrega se pide que se justifique por qué se considera funcionalidad optativa lo que habeis implementado. Sólo a modo de sugerencia, se incluyen algunas posibles funcionalidades optativas:
\begin{itemize}
\item Inclusión de un \emph{favicon} del sitio
\item Generación de un canal XML para los contenidos que se muestran en la página principal.
\item Generación de canales, pero con los contenidos en JSON
\item Generación de un canal RSS para los comentarios puestos en el sitio.
\item Funcionalidad de registro de usuarios
\item Uso de Javascript o AJAX para algún aspecto de la práctica (por ejemplo, para seleccionar un alojamiento para una página de usuario).
\item Puntuación de alojamientos. Cada visitante (registrado o no) puede dar un ``+1'' a cualquier alojamiento del sitio. La suma de ``+'' que ha obtenido un alojamiento se verá cada vez que se vea el alojamiento en el sitio.
\item Uso de elementos HTML5 (especificar cuáles al entregar)
\item Atención al idioma indicado por el navegador. El idioma de la interfaz de usuario del planeta tendrá en cuenta lo que especifique el navegador.
\end{itemize}
%%----------------------------------------------------------------------------
\subsection{Entrega de la práctica}
\begin{itemize}
\item \textbf{Fecha límite de entrega de la práctica:} lunes, 23 de mayo de 2016 a las 02:00 (hora española peninsular)\footnote{Entiéndase la hora como domingo por la noche, ya entrado el lunes.}
%{\bf Convocatoria de junio:} miércoles, 24 de junio de 2015 a las 23:59 (hora peninsular española).
\item \textbf{Fecha de publicación de notas:} martes, 24 de mayo de 2016, en la plataforma Moodle.
%{\bf Convocatoria de junio:} viernes, 26 de junio, en la plataforma Moodle.
\item \textbf{Fecha de revisión:} miércoles, 25 de mayo de 2016 a las 13:30.
%{\bf Convocatoria de junio:} martes, 30 de junio a las 13:30. Se requerirá a algunos alumnos que asistan a la revisión {\bf en persona}; se informará de ello en el mensaje de publicación de notas.
\end{itemize}
La entrega de la práctica consiste en rellenar un formulario (enlazado en el Moodle de la asignatura) y en seguir las instrucciones que se describen a continuación.
\begin{enumerate}
\item El repositorio contendrá todos los ficheros necesarios para que funcione la aplicación (ver detalle más abajo). Es muy importante que el alumno haya realizado un fork del repositorio que se indica a continuación, porque si no, la práctica no podrá ser identificada:
\url{https://github.com/CursosWeb/X-Serv-Practica-Hoteles/}