Giter Club home page Giter Club logo

django-aula's Introduction

Dani Herrera StackOverflow

django-aula's People

Contributors

amorilla avatar ctrl-alt-d avatar fenix15100 avatar jbagot avatar jsubias6 avatar juaky avatar malbareda avatar xeviterr avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

django-aula's Issues

Error al carregar alumnes al horari del professor

Hi ha 3 o 4 proefessor que han intentar adjudicar alumnes a les seves assignatures i dona un error:

Captura de pantalla a 2019-09-12 15-45-26

i envia un missatge:

Internal Server Error: /presencia/passaLlista/1131/

AttributeError at /presencia/passaLlista/1131/
'NoneType' object has no attribute 'id'

Request Method: GET
Request URL: https://xxxx.domini.xxx/presencia/passaLlista/1131/
Django Version: 2.2.5
Python Executable: /opt/djau2019/venv/bin/python
Python Version: 3.6.8
Python Path: ['/opt/djau2019', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/opt/djau2019/venv/lib/python3.6/site-packages']
Server time: dj., 12 Set. 2019 20:10:04 +0200
Installed Applications:
['customising',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
'django_extensions',
'django_tables2',
'django.contrib.humanize',
'aula.apps.missatgeria',
'aula.apps.alumnes',
'aula.apps.assignatures',
'aula.apps.horaris',
'aula.apps.presencia',
'aula.apps.incidencies',
'aula.apps.tutoria',
'aula.apps.extKronowin',
'aula.apps.extSaga',
'aula.apps.extEsfera',
'aula.apps.avaluacioQualitativa',
'aula.apps.todo',
'aula.apps.usuaris',
'aula.apps.relacioFamilies',
'aula.apps.sortides',
'aula.apps.baixes',
'aula.apps.BI',
'aula.apps.aules',
'aula.utils',
'aula.apps.presenciaSetmanal']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'aula.utils.middleware.MultipleProxyMiddleware',
'aula.utils.middleware.NoCacheMiddleware',
'aula.utils.middleware.timeOutMiddleware',
'aula.utils.middleware.IncludeLoginInErrors']

Traceback:

File "/opt/djau2019/venv/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
34. response = get_response(request)

File "/opt/djau2019/venv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
115. response = self.process_exception_by_middleware(e, request)

File "/opt/djau2019/venv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
113. response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/opt/djau2019/venv/lib/python3.6/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
21. return view_func(request, *args, **kwargs)

File "/opt/djau2019/aula/utils/decorators.py" in inner_decorator
17. return func(request, *args, **kwargs)

File "/opt/djau2019/aula/apps/presencia/views.py" in passaLlista
285. esUltimaHora = impartir.reserva_id == ultimaReserva.id

Exception Type: AttributeError at /presencia/passaLlista/1131/
Exception Value: 'NoneType' object has no attribute 'id'
Request information:
USER: castr

GET: No GET data

POST: No POST data

FILES: No FILES data

COOKIES:
_ga = 'GA1.2.2124278731.1473064449'
__utma = '130414477.2124278731.1473064449.1518804336.1519056730.26'
_gid = 'GA1.2.1437090042.1568300106'
csrftoken = 'Zdt7R4sJDCCuqymbuaLDdS22L2fuMbeM9xwKcROKYWAyw4t434mE9XEfI9yqLuSl'
sessionid = 'ujnls8nus6ehayrdcz90sq2lu4m7v21z'

META:
AUTH_NAME = 'Nom Cognoms'
AUTH_USER = 'usuari'
AUTH_USER_EMAIL = '[email protected]'
AUTH_USER_ID = '794'
AUTH_USER_IS_ACTIVE = 'True'
AUTH_USER_IS_STAFF = 'False'
AUTH_USER_IS_SUPERUSER = 'False'
AUTH_USER_LAST_LOGIN = '2019-09-12 19:46:40.737976'
CONTEXT_DOCUMENT_ROOT = '/var/www/html'
CONTEXT_PREFIX = ''
CSRF_COOKIE = 'Zdt7R4sJDCCuqymbuaLDdS22L2fuMbeM9xwKcROKYWAyw4t434mE9XEfI9yqLuSl'
DOCUMENT_ROOT = '/var/www/html'
GATEWAY_INTERFACE = 'CGI/1.1'
HTTP_ACCEPT = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3'
HTTP_ACCEPT_ENCODING = 'gzip, deflate, br'
HTTP_ACCEPT_LANGUAGE = 'es,ca;q=0.9,fr-FR;q=0.8,fr;q=0.7'
HTTP_CONNECTION = 'keep-alive'
HTTP_COOKIE = '_ga=GA1.2.2124278731.1473064449; __utma=130414477.2124278731.1473064449.1518804336.1519056730.26; _gid=GA1.2.1437090042.1568300106; csrftoken=Zdt7R4sJDCCuqymbuaLDdS22L2fuMbeM9xwKcROKYWAyw4t434mE9XEfI9yqLuSl; sessionid=ujnls8nus6ehayrdcz90sq2lu4m7v21z'
HTTP_HOST = 'xxxxx..domini.cat'
HTTP_REFERER = 'https://xxxxx..domini.cat/presencia/mostraImpartir/2019/9/16/'
HTTP_SEC_FETCH_MODE = 'navigate'
HTTP_SEC_FETCH_SITE = 'same-origin'
HTTP_SEC_FETCH_USER = '?1'
HTTP_UPGRADE_INSECURE_REQUESTS = '1'
HTTP_USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
PATH_INFO = '/presencia/passaLlista/1131/'
PATH_TRANSLATED = '/opt/djau2019/aula/wsgi.py/presencia/passaLlista/1131/'
QUERY_STRING = ''
REMOTE_ADDR = '159.147.213.107'
REMOTE_PORT = '52094'
REQUEST_METHOD = 'GET'
REQUEST_SCHEME = 'https'
REQUEST_URI = '/presencia/passaLlista/1131/'
SCRIPT_FILENAME = '/opt/djau2019/aula/wsgi.py'
SCRIPT_NAME = ''
SERVER_ADDR = '192.168.201.11'
SERVER_ADMIN = '[email protected]'
SERVER_NAME = 'xxxxx..domini.cat'
SERVER_PORT = '443'
SERVER_PROTOCOL = 'HTTP/1.1'
SERVER_SIGNATURE = '

Apache/2.4.29 (Ubuntu) Server at
xxxxx..domini.cat Port 443\n'
SERVER_SOFTWARE = 'Apache/2.4.29 (Ubuntu)'
SSL_TLS_SNI = 'xxxxx..domini.cat'
apache.version = '(2, 4, 27)'
mod_wsgi.application_group = ''
mod_wsgi.callable_object = 'application'
mod_wsgi.daemon_connects = '1'
mod_wsgi.daemon_restarts = '0'
mod_wsgi.daemon_start = '1568311804459833'
mod_wsgi.enable_sendfile = '0'
mod_wsgi.handler_script = ''
mod_wsgi.ignore_activity = '0'
mod_wsgi.listener_host = ''
mod_wsgi.listener_port = '443'
mod_wsgi.path_info = '/presencia/passaLlista/1131/'
mod_wsgi.process_group = 'djau'
mod_wsgi.queue_start = '1568311804459683'
mod_wsgi.request_handler = 'wsgi-script'
mod_wsgi.request_id = '8HkADGdYqow'
mod_wsgi.request_start = '1568311804459504'
mod_wsgi.script_name = ''
mod_wsgi.script_reloading = '1'
mod_wsgi.script_start = '1568311804459923'
mod_wsgi.thread_id = 5
mod_wsgi.thread_requests = 2258
mod_wsgi.total_requests = 18317
mod_wsgi.version = '(4, 5, 17)'
wsgi.errors = <_io.TextIOWrapper name='<wsgi.errors>' encoding='utf-8'>
wsgi.file_wrapper = ''
wsgi.input = <mod_wsgi.Input object at 0x7f106c763420>
wsgi.multiprocess = False
wsgi.multithread = True
wsgi.run_once = False
wsgi.url_scheme = 'https'
wsgi.version = '(1, 0)'

Settings:
Using settings module aula.settings
ABSOLUTE_URL_OVERRIDES = {}
ACCES_RESTRINGIT_A_GRUPS = None
ADMINS = "(('admin', '[email protected]'),)"
ALLOWED_HOSTS = ['*']
APPEND_SLASH = True
ATOMIC_REQUESTS = True
AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend']
AUTH_PASSWORD_VALIDATORS = ''
AUTH_USER_MODEL = 'auth.User'
AUTO_RENDER_SELECT2_STATICS = False
BI_DIR = '/opt/djau2018/aula/apps/BI/PMML'
CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}, 'select2': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'TIMEOUT': 14400, 'OPTIONS': {'MAX_ENTRIES': 200}}}
CACHE_MIDDLEWARE_ALIAS = 'default'
CACHE_MIDDLEWARE_KEY_PREFIX = '
'
CACHE_MIDDLEWARE_SECONDS = 600
COMPRESS_ENABLED = False
CSRF_COOKIE_AGE = 31449600
CSRF_COOKIE_DOMAIN = None
CSRF_COOKIE_HTTPONLY = False
CSRF_COOKIE_NAME = 'csrftoken'
CSRF_COOKIE_PATH = '/'
CSRF_COOKIE_SAMESITE = 'Lax'
CSRF_COOKIE_SECURE = False
CSRF_FAILURE_VIEW = 'django.views.csrf.csrf_failure'
CSRF_HEADER_NAME = 'HTTP_X_CSRFTOKEN'
CSRF_TRUSTED_ORIGINS = []
CSRF_USE_SESSIONS = False
CUSTOM_DATE_FORMAT = '%-d %B de %Y'
CUSTOM_DIES_PRESCRIU_EXPULSIO = 90
CUSTOM_DIES_PRESCRIU_INCIDENCIA = 30
CUSTOM_FALTES_ABSENCIA_PER_CARTA = 1
CUSTOM_FALTES_ABSENCIA_PER_NIVELL_NUM_CARTA = {}
CUSTOM_FALTES_ABSENCIA_PER_TIPUS_CARTA = {'tipus1': 1}
CUSTOM_FORMULARI_SORTIDES_REDUIT = True
CUSTOM_INCIDENCIES_PROVOQUEN_EXPULSIO = True
CUSTOM_INDICADORS = []
CUSTOM_LC_TIME = None
CUSTOM_MARCA_MAJORS_EDAT = ' (^18)'
CUSTOM_MODUL_PRESENCIA_SETMANAL_ACTIU = False
CUSTOM_MODUL_SORTIDES_ACTIU = True
CUSTOM_MOSTRAR_MAJORS_EDAT = False
CUSTOM_NIVELLS = {'ESO': ['ESO'], 'BTX': ['BTX'], 'CICLES': ['GA', 'AF', 'SMX', 'DAW', 'FCT', 'CFA', 'CFI'], 'INFORMATICA': ['SMX', 'DAW']}
CUSTOM_NOMES_TUTOR_POT_JUSTIFICAR = True
CUSTOM_NO_CONTROL_ES_PRESENCIA = False
CUSTOM_ORDER_PRESENCIA = ['alumne']
CUSTOM_PERIODE_CREAR_O_MODIFICAR_INCIDENCIA = 90
CUSTOM_PERIODE_MODIFICACIO_ASSISTENCIA = 90
CUSTOM_PERMET_COPIAR_DES_DUNA_ALTRE_HORA = False
CUSTOM_PORTAL_FAMILIES_TUTORIAL = ''
CUSTOM_RESERVES_API_KEY = ''
CUSTOM_RETARD_FRASE = 'Ha arribat tard a classe.'
CUSTOM_RETARD_PRIMERA_HORA_GESTIONAT_PEL_TUTOR = False
CUSTOM_RETARD_PROVOCA_INCIDENCIA = True
CUSTOM_RETARD_TIPUS_INCIDENCIA = {'tipus': 'Incidència', 'es_informativa': False}
CUSTOM_SORTIDES_INSTRUCCIONS_PAGAMENT = 'Podeu fer el pagament amb targeta de crèdit a qualsevol caixer de CaixaBank, amb el codi de barres o amb el codi entitat: XXXXXXXXXX'
CUSTOM_SORTIDES_INSTRUCCIONS_PAGAMENT_EFECTIU = "El pagament s'ha de realitzar en efectiu al professor organitzador de la sortida o al tutor."
CUSTOM_SORTIDES_INSTRUCCIONS_PAGAMENT_ENTITAT_BANCARIA = "El pagament s'ha de realitzar als Caixers del Banc Sabadell (qualsevol targeta de qualsevol entitat funciona per realitzar el pagament, no cal tenir compte al Banc) a pagament a tercers i posar el codi de pagament: 5805."
CUSTOM_SORTIDES_INSTRUCCIONS_PAGAMENT_ONLINE = "El pagament s'ha de realitzar a través de la web d'informació a les famílies de l'Institut dJau"
CUSTOM_SORTIDES_PAGAMENT_CAIXER = True
CUSTOM_SORTIDES_PAGAMENT_ONLINE = False
CUSTOM_TIMEOUT = 900
CUSTOM_TIMEOUT_GROUP = {'consergeria': 14400, 'professors': 900}
CUSTOM_TIPUS_INCIDENCIES = False
CUSTOM_TUTORS_INFORME = False
DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'djau2019', 'USER': 'djau2019', 'PASSWORD': '
', 'HOST': 'xxxxx..domini.cat', 'PORT': '5432', 'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'CONN_MAX_AGE': 0, 'OPTIONS': {}, 'TIME_ZONE': None, 'TEST': {'CHARSET': None, 'COLLATION': None, 'NAME': None, 'MIRROR': None}}}
DATABASE_ROUTERS = []
DATA_UPLOAD_MAX_MEMORY_SIZE = 2621440
DATA_UPLOAD_MAX_NUMBER_FIELDS = 1000
DATETIME_FORMAT = 'N j, Y, P'
DATETIME_INPUT_FORMATS = ['%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M:%S.%f', '%Y-%m-%d %H:%M', '%Y-%m-%d', '%m/%d/%Y %H:%M:%S', '%m/%d/%Y %H:%M:%S.%f', '%m/%d/%Y %H:%M', '%m/%d/%Y', '%m/%d/%y %H:%M:%S', '%m/%d/%y %H:%M:%S.%f', '%m/%d/%y %H:%M', '%m/%d/%y']
DATE_FORMAT = 'N j, Y'
DATE_INPUT_FORMATS = ['%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', '%b %d %Y', '%b %d, %Y', '%d %b %Y', '%d %b, %Y', '%B %d %Y', '%B %d, %Y', '%d %B %Y', '%d %B, %Y']
DEBUG = False
DEBUG_PROPAGATE_EXCEPTIONS = False
DECIMAL_SEPARATOR = '.'
DEFAULT_CHARSET = 'utf-8'
DEFAULT_CONTENT_TYPE = 'text/html'
DEFAULT_EXCEPTION_REPORTER_FILTER = 'django.views.debug.SafeExceptionReporterFilter'
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
DEFAULT_FROM_EMAIL = 'Institut Sa Palomera [email protected]'
DEFAULT_INDEX_TABLESPACE = ''
DEFAULT_TABLESPACE = ''
DISALLOWED_USER_AGENTS = []
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_PASSWORD = ''
EMAIL_HOST_USER = '[email protected]'
EMAIL_PORT = 587
EMAIL_SSL_CERTFILE = None
EMAIL_SSL_KEYFILE = '
'
EMAIL_SUBJECT_PREFIX = '[Comunicació Institut Sa Palomera]'
EMAIL_TIMEOUT = None
EMAIL_USE_LOCALTIME = False
EMAIL_USE_SSL = False
EMAIL_USE_TLS = True
FILE_CHARSET = 'utf-8'
FILE_UPLOAD_DIRECTORY_PERMISSIONS = None
FILE_UPLOAD_HANDLERS = ['django.core.files.uploadhandler.MemoryFileUploadHandler', 'django.core.files.uploadhandler.TemporaryFileUploadHandler']
FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440
FILE_UPLOAD_PERMISSIONS = None
FILE_UPLOAD_TEMP_DIR = None
FIRST_DAY_OF_WEEK = 0
FIXTURE_DIRS = []
FORCE_SCRIPT_NAME = None
FORMAT_MODULE_PATH = None
FORM_RENDERER = 'django.forms.renderers.DjangoTemplates'
IGNORABLE_404_URLS = []
INSTALLED_APPS = ['customising', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.sites', 'django_extensions', 'django_tables2', 'django.contrib.humanize', 'aula.apps.missatgeria', 'aula.apps.alumnes', 'aula.apps.assignatures', 'aula.apps.horaris', 'aula.apps.presencia', 'aula.apps.incidencies', 'aula.apps.tutoria', 'aula.apps.extKronowin', 'aula.apps.extSaga', 'aula.apps.extEsfera', 'aula.apps.avaluacioQualitativa', 'aula.apps.todo', 'aula.apps.usuaris', 'aula.apps.relacioFamilies', 'aula.apps.sortides', 'aula.apps.baixes', 'aula.apps.BI', 'aula.apps.aules', 'aula.utils', 'aula.apps.presenciaSetmanal']
INSTALLED_APPS_AULA = ['aula.apps.missatgeria', 'aula.apps.alumnes', 'aula.apps.assignatures', 'aula.apps.horaris', 'aula.apps.presencia', 'aula.apps.incidencies', 'aula.apps.tutoria', 'aula.apps.extKronowin', 'aula.apps.extSaga', 'aula.apps.extEsfera', 'aula.apps.avaluacioQualitativa', 'aula.apps.todo', 'aula.apps.usuaris', 'aula.apps.relacioFamilies', 'aula.apps.sortides', 'aula.apps.baixes', 'aula.apps.BI', 'aula.apps.aules', 'aula.utils', 'aula.apps.presenciaSetmanal']
INSTALLED_APPS_DJANGO = ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.sites', 'django_extensions', 'django_tables2', 'django.contrib.humanize']
INTERNAL_IPS = []
LANGUAGES = "(('ca', 'Català'),)"
LANGUAGES_BIDI = ['he', 'ar', 'fa', 'ur']
LANGUAGE_CODE = 'ca'
LANGUAGE_COOKIE_AGE = None
LANGUAGE_COOKIE_DOMAIN = None
LANGUAGE_COOKIE_NAME = 'django_language'
LANGUAGE_COOKIE_PATH = '/'
LICENSE_FILE = '/opt/djau2019/aula/settings_dir/../../LICENSE'
LOCALE_PATHS = []
LOCALITAT = 'Blanes'
LOGGING = {'version': 1, 'disable_existing_loggers': False, 'filters': {'require_debug_false': {'()': 'django.utils.log.RequireDebugFalse'}, 'stop_suspicious_operation': {'()': 'aula.utils.loggingFilters.StopSuspiciousOperation'}}, 'handlers': {'mail_admins': {'level': 'ERROR', 'filters': ['require_debug_false', 'stop_suspicious_operation'], 'class': 'django.utils.log.AdminEmailHandler'}}, 'loggers': {'django.request': {'handlers': ['mail_admins'], 'level': 'ERROR', 'propagate': True}}}
LOGGING_CONFIG = 'logging.config.dictConfig'
LOGIN_REDIRECT_URL = '/accounts/profile/'
LOGIN_URL = '/usuaris/login/'
LOGOUT_REDIRECT_URL = None
MANAGERS = "(('dani Herrera', '[email protected]'),)"
MEDIA_ROOT = ''
MEDIA_URL = ''
MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'aula.utils.middleware.MultipleProxyMiddleware', 'aula.utils.middleware.NoCacheMiddleware', 'aula.utils.middleware.timeOutMiddleware', 'aula.utils.middleware.IncludeLoginInErrors']
MIGRATION_MODULES = {}
MONTH_DAY_FORMAT = 'F j'
NOM_CENTRE = 'Institut Sa Palomera'
NUMBER_GROUPING = 0
PASSWORD_HASHERS = ''
PASSWORD_RESET_TIMEOUT_DAYS = '
'
PREDICTION_TREE = None
PREPEND_WWW = False
PROJECT_DIR = '/opt/djau2019/aula/settings_dir/..'
ROOT_URLCONF = 'aula.urls'
SECRET_KEY = '********************'
SECURE_BROWSER_XSS_FILTER = False
SECURE_CONTENT_TYPE_NOSNIFF = False
SECURE_HSTS_INCLUDE_SUBDOMAINS = False
SECURE_HSTS_PRELOAD = False
SECURE_HSTS_SECONDS = 0
SECURE_PROXY_SSL_HEADER = None
SECURE_REDIRECT_EXEMPT = []
SECURE_SSL_HOST = None
SECURE_SSL_REDIRECT = False
SELECT2_CACHE_BACKEND = 'default'
SELECT2_CACHE_PREFIX = 'select2_'
SELECT2_CSS = '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css'
SELECT2_I18N_AVAILABLE_LANGUAGES = ['ar', 'az', 'bg', 'ca', 'cs', 'da', 'de', 'el', 'en', 'es', 'et', 'eu', 'fa', 'fi', 'fr', 'gl', 'he', 'hi', 'hr', 'hu', 'id', 'is', 'it', 'ja', 'km', 'ko', 'lt', 'lv', 'mk', 'ms', 'nb', 'nl', 'pl', 'pt-BR', 'pt', 'ro', 'ru', 'sk', 'sr-Cyrl', 'sr', 'sv', 'th', 'tr', 'uk', 'vi', 'zh-CN', 'zh-TW']
SELECT2_I18N_PATH = '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/i18n'
SELECT2_JS = '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js'
SEND_BROKEN_LINK_EMAILS = False
SERVER_EMAIL = '[email protected]'
SESSION_CACHE_ALIAS = 'default'
SESSION_COOKIE_AGE = 1209600
SESSION_COOKIE_DOMAIN = None
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_NAME = 'sessionid'
SESSION_COOKIE_PATH = '/'
SESSION_COOKIE_SAMESITE = 'Lax'
SESSION_COOKIE_SECURE = True
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
SESSION_FILE_PATH = None
SESSION_SAVE_EVERY_REQUEST = False
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
SETTINGS_MODULE = 'aula.settings'
SHORT_DATETIME_FORMAT = 'm/d/Y P'
SHORT_DATE_FORMAT = 'm/d/Y'
SIGNING_BACKEND = 'django.core.signing.TimestampSigner'
SILENCED_SYSTEM_CHECKS = []
SITE_ID = 1
STATICFILES_DIRS = ['/opt/djau2019/aula/settings_dir/../site-css']
STATICFILES_FINDERS = "('django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder')"
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
STATIC_ROOT = '/opt/djau2019/aula/settings_dir/../static/'
STATIC_URL = 'https://xxxxx..domini.cat/site-css/'
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': ['/opt/djau2019/aula/settings_dir/../../customising/templates', '/opt/djau2019/aula/settings_dir/../templates'], 'OPTIONS': {'debug': True, 'context_processors': ['django.contrib.auth.context_processors.auth', 'django.template.context_processors.debug', 'django.template.context_processors.media', 'django.template.context_processors.static', 'django.contrib.messages.context_processors.messages', 'django.template.context_processors.csrf', 'django.template.context_processors.request', 'aula.utils.context_processors.dades_basiques'], 'loaders': ['django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader']}}]
TEST_NON_SERIALIZED_APPS = []
TEST_RUNNER = 'django.test.runner.DiscoverRunner'
THOUSAND_SEPARATOR = ','
TIME_FORMAT = 'P'
TIME_INPUT_FORMATS = ['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
TIME_ZONE = 'Europe/Madrid'
URL_DJANGO_AULA = 'https://xxxxx..domini.cat'
USE_I18N = True
USE_L10N = True
USE_THOUSAND_SEPARATOR = False
USE_TZ = False
USE_X_FORWARDED_HOST = False
USE_X_FORWARDED_PORT = False
WSGI_APPLICATION = 'aula.wsgi.application'
X_FRAME_OPTIONS = 'SAMEORIGIN'
YEAR_MONTH_FORMAT = 'F Y'

Substitueix aquesta línia per una descripció clara i concisa del "bug" (error).

El professor que intenten afegir alumnes a la seva llista d'aula, genera missatges d'error intern i envia missatge.

Incidència assignada a tutor individualitzat per "retard d'entrada al centre"

Descriu el problema
Si un alumne té un tutor individualitzat a més del seu tutor de grup, pot passar que se li assigni una incidència (per retard d'entrada al centre) al tutor individual i no al de grup.

Passes per reproduir-ho
Passes per reproduir aquest error:

  1. Entrar com a usuari conserge i posar un retard a un alumne que tingui tutor individualitzat i tutor de grup.
  2. Se li assignarà la incidència al primer tutor (individual o de grup) en ordre alfabètic per cognom.

*Comportament esperat
S'espera la incidència se li assigni sempre al tutor del grup i no a l'individualitzat. Tots els alumnes tenen al menys un tutor de grup.

Informació adicional
Codi que prova l'error: https://github.com/ctrl-alt-d/django-aula/blob/master/aula/apps/incidencies/views.py#L419

Possible solució

No puc esborrar un tipus d'incidència

Hem creat diferents incidències. Al fer-ho hem volgut esborrar o renombrar les que hi havia.
La que es deia Lleu no la podem esborrar. Si ho fem, al cap de poc torna a apareixer. I si li canviem el nom, al cap de poc recupera el que tenia (Lleu).
Hem de fer alguna cosa abans d'esborrar-la?
I un cop ho hem esborrat, com podem canviar l'ordre de les que queden?
Gràcies

Error retrocedint estat d'una activitat

Quan s'intenta retrocedir estat d'activitat de proposada a esborrany apareix l'error:

Només Direcció o el coordinador de sortides pot marcar com aprovada pel Consell Escolar.

Falla lectura de fitxers amb wsgi

Fent servir la versió de python3 amb apache i wsgi falla en lectura de fitxers.
Si s'executa amb runserver (sense wsgi) funciona ok.
He provat amb libapache2-mod-wsgi-py3.
He provat amb mod_wsgi des de python amb pip install mod_wsgi.
Amb les dues opcions s'obté el mateix comportament.

Per exemple falla a:
Ajuda i Avisos / About
Al llegir les cartes generades a Tutoria / Cartes

El problema és la lectura de fitxers:
aula/utils/view.py:
Aquest codi falla:
def about(request):
.....
licenseFile = open (settings.LICENSE_FILE, "r")
tip=licenseFile.read() Aquesta és la línia que falla

Copiant el fitxer LICENSE a carpeta static, amb aquest codi mostra el fitxer:
import urllib.request as geturl
f=geturl.urlopen("http://djau3.local/static/LICENSE")
tip=f.read()

aula/apps/tutoria/report_carta_absentisme.py:
falla a contingut = docFile.read()

No sé si estic fent res malament o no queda més remei que fer un canvi en la manera de llegir fitxers.

Missatge de correu amb ERROR

Rebo a la bústia del programa el següent missatge:

ERROR (EXTERNAL IP): Invalid HTTP_HOST header: 'XXXXXXXX'. You may need to add u'XXXXXXXX' to ALLOWED_HOSTS.

Com ho puc solucionar?

Còmput de la presència i dret de vaga

Em comenten que:

Segons indicacions del Departament les faltes per vaga, no s’han de computar com a FALTES (ni tampoc com a FALTES INJUSTIFICADES). Per tant no s’han de tenir en compte en el càlcul del percentatges d’assistència en cicles i batxillerat (mínim 80%)

Possible solució

Ara, l'estructura de dades del djau, permet posar un 'flag' que indica que l'alumne 'No ha de ser a l'aula'. Els motius detectats fins ara:

    MOTIUS_CHOICE = ( 
                       (EXPULSAT_DEL_CENTRE, u"Expulsat del centre",),
                       (SORTIDA,u"Activitat",),
                       (ANULLADA, u"Classe Anul·lada"),
                     )

Potser es podria afegir el motiu 'Vaga' i fer el front-end (la pantalla) perquè algú (tutor? cap d'estudis?) marqui l'alumne com a vaguista d'aquella classe.

De cara al còmput d'assistència, es podria tenir en compte el 'flag' anterior, per determinar tant si aquell dia compta com a classe i com si l'alumne ha assistit o no.
També estaria bé 'estandarditzar' com es realitzen aquests còmputs:

  • Un professor que posa un alumne a la llista i no li passa llista, compte com a dia de classe?
  • Si compte com a dia de classe, cal comptar presència o absència?
  • Les faltes justificades sumen al % d'absència?
  • Si un alumne està expulsat, compte com absència o presència o els dies que està expulsat no compten?
  • Quan hi ha una activitat crec que actualment no passem llista (?)

En resum:

Crec que el més ràpid i coherent seria afegir un nou motiu per no ser a l'aula i que, simplement, aquell dia no es tingués en compte. Això funciona en l'àmbit d'alumne, per tant, es computa la presència de manera 'estàndard' als alumnes que no fan vaga vagin o no a classe. Amb aquest sistema també es pot entrar la vaga (o treure-la) de manera retroactiva sense problemes. Com veieu, per ara no sóc partidari de crear el 'V' (vaga), m'agradaria mantenir el [ Present ] [ Falta ] [ Justificada ] [ Retard ] // [ No ha de ser a classe: Vaga ] si no hi veieu inconvenient.

Cal pensar la IU per a realitzar aquestes tasques doncs, hi ha instituts on es passa llista normal i, a posteriori, se li 'anul·laria' la classe als alumnes que fan vaga selectivament.

Alternatives

Qualsevol comentari és benvingut, ja sigui sobre l'operativa o sobre la normativa.

Context addicional

Estaria bé disposar de referències clares a la normativa per poder realitzar els càlculs de manera correcta.

És djau codi obert?

Amb DJAU disfruta de les 4 llibertats:

  • Llibertat per fer servir el programa.
  • Llibertat per veure com està fet.
  • Llibertat per a modificar-lo segons les teves necessitats.
  • Llibertat per a compartir aquestes modificacacions.

Si fas modificacions disruptives, procura crear un paràmetre al settings.py de manera que el program segueixi funcionant tal com feia fins ara. Mira't aquest Pull Request d'exemple.

Activar estadística de faltes de primera hora

Atenció! No incloure dades sensibles en aquest formulari.

Informa quin tipus d'ajuda necessites:

  • Necessito ajuda tècnica per tal de modificar o posar en marxa el programa.
  • Necessito ajuda funcional per entendre alguna pantalla.

Explica que tens fet fins ara:
Fa dies vam parlar de la possibilitat d'habilitat una estadística en format gràfic, sobretot de l'assistència a primeres hores. Quines modificacions he de fer per activar aquesta opció?

Problemes amb la generació de cartes

Exception at /tutoria/gestioCartes/
Error triant la carta a enviar a la familia

Es genera un error al donar a l'opció de cartes del Django-Aula.
Considero que els errors estan provocats pel desconeixement en la configuració d'aquest apartat i en les modificacions realitzades en alguns apartats.

Modificacions realitzades que poden afectar

  • Llista de Nivells:
    ESO (ESO)
    BAT (BAT)
    CAM (CAM)
    CIS (CIS)
    GAD (GAD GM)
    ADF (ADF GS)
    ACO (ACO GM)
    GVE (GVE GS)
    SMX (SMX GM)
    DAW (DAW GS)
    ASX (ASX GS)

  • Tipus d'incidències:
    Molt Greus (Avís a l'Equip Directiu)
    Greu (Implica expulsió de l'aula)
    Lleu (No implica expulsió de l'aula)
    Acadèmica (Bona o dolenta)

Settings.py
CUSTOM_NIVELLS = {u'ESO': [u'ESO'], u'INFORMATICA': [u'SMX', u'DAW', u'ASX'], u'CICLES': [u'GAD', u'ADF', u'ACO', u'GVE', u'SMX', u'DAW', u'ASX'], u'BTX': [u'BAT', u'CAM', u'CIS']}

#Número de faltes no justificades per tal de generar carta
#Els tipus de carta els trobareu a:
#aula/apps/tutoria/business_rules/cartaaabsentisme.py
CUSTOM_FALTES_ABSENCIA_PER_CARTA = 15
CUSTOM_FALTES_ABSENCIA_PER_TIPUS_CARTA = { 'tipus1': 15 }
CUSTOM_DIES_PRESCRIU_EXPULSIO = 90
CUSTOM_MODUL_SORTIDES_ACTIU = False

Les cartes no s'han personalitzat
No hem tocat cap carta, ni les hem personalitzat ni les hem creat._**

Incidència a l'hora d'enviar notificacions diàries als pares

Els pares del alumnes no estan rebent el missatge diari amb les incidències.

Hi ha dos possibles casos:

Pares donats d'alta al sistema i han completat l'accés al portal, i no reben missatges.

Pares convidats que no completen l'accés al portal, (normalment els que tenen més incidències), no reben missatges.

Com ho puc solventar?

Hem fer la prova amb dos alumnes test (els fills del Cap d'estudi i la coordinadora pedagògica), han posat incidències i no han rebut missatge.

Esborrar controls d'assistència a mà

Com esborrar tots els controls d'assistència d'un alumne i assignatura durant un periode de temps?

  1. Revisar i customitzar el codi de sota
  2. Entrar a la shell python manage.py shell i executar-lo
username_direccio = "M1"
nom_alumne = "Oriol"
cognoms_alumne = 'Amaya Linares'
desde = "2018-01-01"
finsa = "2018-12-05"
nom_assignatura = 'MA'
esborrar_confirmat = False # posar-ho a true per a que esborri



usuari_direccio = User.objects.get( username = username_direccio )
alumne = Alumne.objects.get( nom = nom_alumne, cognoms = cognoms_alumne )
falta = EstatControlAssistencia.objects.get( codi_estat = "F" )

from aula.apps.alumnes.models import Alumne
from aula.apps.assignatures.models import Assignatura
from aula.apps.presencia.models import ControlAssistencia, EstatControlAssistencia
from django.contrib.auth.models import User
from django.conf import settings

fake_credentials = ( usuari_direccio , True )

settings.CUSTOM_PERIODE_MODIFICACIO_ASSISTENCIA = 1000

controls = list( 
            ControlAssistencia
            .objects
            .filter( impartir__dia_impartir__gte = desde,
                     impartir__dia_impartir__lte = finsa,
                     impartir__horari__assignatura__nom_assignatura = nom_assignatura,
                     alumne = alumne )
            )

dades_associades = lambda c: ( c.expulsio_set.exists() or 
                               c.incidencia_set.exists() or
                               c.nohadeseralaula_set.exists()
                              )

print "*** Aquests són els controls que s'esborraran ***"
for c in controls:
   print c, c.impartir, "<-- ** No es podra esborrar **" if dades_associades(c) else ""

if esborrar_confirmat:
   for c in controls:
      if not dades_associades(c):
        c.credentials = fake_credentials
        c.estat = falta
        c.save()
        c.delete()
   

Disclaimer Aquest procés no ha estat provat en producció, és una proposta. Si el proveu feu feedback. Recordeu fer un backup de la base de dades abans de tocar coses manualment.

Presencia: ordenar diferent

Hola,

tant quan arribes per primer cop a la pantalla (via get):

https://github.com/ctrl-alt-d/django-aula/blob/master/aula/apps/presencia/views.py#L373

Com quan fas submit i et mostra errors (via post):

https://github.com/ctrl-alt-d/django-aula/blob/master/aula/apps/presencia/views.py#L304

Veig que ordena per alumne. El que passa és que l'ordenació per alumne inclou el grup:

https://github.com/ctrl-alt-d/django-aula/blob/master/aula/apps/alumnes/abstract_models.py#L157

Molt bona oportunitat per estrenar-te i enviar un Pull Request amb els canvis

Canvis a fer:

  1. Fas un fork del repo de github.

https://help.github.com/articles/fork-a-repo/

  1. Creas un CUSTOM que digui per quin camp ordenem. Exemple:
CUSTOM_ORDER_PRESENCIA = ['alumne']

https://github.com/ctrl-alt-d/django-aula/blob/master/aula/settings.py#L3

  1. Modificques la pantalla per tal que ordeni pel custom:
for control_a in ( impartir.controlassistencia_set
                           .order_by(**settings.CUSTOM_ORDER_PRESENCIA)):
  1. Al teu settings local ordenes pel que vulguis:
CUSTOM_ORDER_PRESENCIA = ['alumne__cognoms','alumne__nom',]
  1. Fas PullRequest dels canvis per a que tothom pugui disfrutar-ho:

https://help.github.com/articles/creating-a-pull-request-from-a-fork/

He pogut fer un merge a la branca Master.... i no hauria.

No estic molt versat en el Git, però crec que he fet un merge a la Branca master d'una funcionalitat.
Si pot ser no em doneu aquest permís, la puc liar molt, no domino el Git com per fer aquestes coses. Abans crec que no ho podia fer.
En tot cas prometo no fer-ho més sense que reviseu el push request.
El que he afegit ara simplement era per actualitzar els tests a python3.

Problema al fer la actualització

Descripció el problema
Tinc problemes per a fer la actualització de la versió per a incorporar la funcionalitat de les fotos.

Passes per reproduir-ho
En el meu cas he fet :
cd /opt/djau2019
git pull
source venv/bin/activate
python manage.py migrate

  1. L'error que he obtingut és:
    djau2019@freser:~$ cd /opt/djau2019/
    djau2019@freser:/opt/djau2019$ git pull
    remote: Enumerating objects: 306, done.
    remote: Counting objects: 100% (306/306), done.
    remote: Compressing objects: 100% (16/16), done.
    remote: Total 447 (delta 295), reused 292 (delta 290), pack-reused 141
    S'estan rebent objectes: 100% (447/447), 1.86 MiB | 1.59 MiB/s, fet.
    S'estan resolent les diferències: 100% (360/360), s'ha completat amb 104 objectes locals.
    De https://github.com/ctrl-alt-d/django-aula
    4103d06..f6544e7 master -> origin/master
    0aaddb2..199db00 develop -> origin/develop
  • [branca nova] feature/docQuimSaurina -> origin/feature/docQuimSaurina
    be8e3d6..1df13bf feature/fotos -> origin/feature/fotos
  • [branca nova] feature/nomalumne -> origin/feature/nomalumne
  • [branca nova] feature/toniAlsCredits -> origin/feature/toniAlsCredits
  • [branca nova] hackoctoberfest -> origin/hackoctoberfest
  • [etiqueta nova] 2019-09-001 -> 2019-09-001
    S'estan actualitzant 4103d06..f6544e7
    Fast-forward
    LICENSE | 12 +-
    README.md | 2 +
    aula/apps/alumnes/abstract_models.py | 24 +-
    aula/apps/alumnes/gestioGrups.py | 78 +++
    aula/apps/alumnes/migrations/0010_alumne_foto.py | 20 +
    aula/apps/alumnes/migrations/0011_auto_20191002_1753.py | 20 +
    aula/apps/alumnes/templates/mostraInfoAlumneCercat.html | 4 +
    aula/apps/alumnes/templates/sincronitzaSaga.html | 6 +-
    aula/apps/alumnes/urls.py | 5 +
    aula/apps/alumnes/views.py | 102 +++-
    aula/apps/assignatures/abstract_models.py | 4 +-
    aula/apps/assignatures/business_rules/assignatura.py | 4 +-
    aula/apps/assignatures/migrations/0004_auto_20190922_2001.py | 18 +
    aula/apps/avaluacioQualitativa/reports.py | 4 +-
    aula/apps/baixes/rpt_carpeta.py | 5 +-
    aula/apps/extEsfera/sincronitzaEsfera.py | 4 +-
    aula/apps/extSaga/sincronitzaSaga.py | 4 +
    aula/apps/extUntis/init.py | 0
    aula/apps/extUntis/admin.py | 6 +
    aula/apps/extUntis/forms.py | 4 +
    aula/apps/extUntis/migrations/0001_initial.py | 29 ++
    aula/apps/extUntis/migrations/0002_auto_20191014_1118.py | 17 +
    aula/apps/extUntis/migrations/init.py | 0
    aula/apps/extUntis/models.py | 13 +
    aula/apps/extUntis/sincronitzaUntis.py | 766 ++++++++++++++++++++++++++++
    aula/apps/extUntis/templates/sincronitzaUntis.html | 9 +
    aula/apps/extUntis/urls.py | 8 +
    aula/apps/extUntis/views.py | 48 ++
    aula/apps/horaris/abstract_models.py | 32 +-
    aula/apps/horaris/migrations/0005_auto_20191009_1056.py | 31 ++
    aula/apps/incidencies/views.py | 9 +-
    aula/apps/missatgeria/views.py | 13 +-
    aula/apps/presencia/forms.py | 3 +-
    aula/apps/presencia/migrations/0007_auto_20191013_1307.py | 19 +
    aula/apps/presencia/migrations/0008_auto_20191020_0114.py | 19 +
    aula/apps/presencia/regeneraImpartir.py | 2 +-
    aula/apps/presencia/reports.py | 34 +-
    aula/apps/presencia/rpt_faltesAssistenciaEntreDatesGrup.py | 14 +-
    aula/apps/presencia/rpt_faltesAssistenciaEntreDatesProfessor.py | 15 +-
    aula/apps/presencia/templates/passaLlistaGrup.html | 2 +-
    aula/apps/presencia/views.py | 8 +-
    aula/apps/presenciaSetmanal/views.py | 2 +-
    aula/apps/relacioFamilies/forms.py | 44 +-
    aula/apps/relacioFamilies/templates/configuraConnexio.html | 17 +
    aula/apps/relacioFamilies/templates/report_detall_families.html | 2 +-
    aula/apps/relacioFamilies/views.py | 26 +-
    aula/apps/sortides/business_rules/sortida.py | 10 +-
    aula/apps/sortides/migrations/0014_auto_20191027_1228.py | 18 +
    aula/apps/sortides/templates/autoritzacio2.odt | Bin 216437 -> 216750 bytes
    aula/apps/sortides/views.py | 73 ++-
    aula/apps/tutoria/reports.py | 7 +-
    aula/apps/tutoria/rpt_elsMeusAlumnesTutorats.py | 6 +-
    aula/apps/tutoria/rpt_gestioCartes.py | 5 +-
    aula/apps/tutoria/views.py | 4 +-
    aula/apps/usuaris/abstract_usuaris.py | 4 +-
    aula/apps/usuaris/migrations/0004_auto_20190924_1045.py | 18 +
    aula/apps/usuaris/migrations/0004_dadesadicionalsprofessor.py | 23 +
    aula/apps/usuaris/migrations/0005_auto_20190922_2001.py | 18 +
    aula/apps/usuaris/migrations/0006_auto_20191013_1050.py | 18 +
    aula/apps/usuaris/migrations/0007_merge_20191023_1150.py | 14 +
    aula/apps/usuaris/migrations/0008_auto_20191027_1228.py | 18 +
    aula/apps/usuaris/models.py | 17 +-
    aula/apps/usuaris/templates/integraCalendari.html | 58 +++
    aula/apps/usuaris/urls.py | 8 +-
    aula/apps/usuaris/views.py | 115 ++++-
    aula/settings.py | 8 +-
    aula/settings_dir/common.py | 4 +-
    aula/settings_local.sample | 4 +-
    aula/site-css/nofoto.png | Bin 0 -> 2389 bytes
    aula/templates/form.html | 2 +-
    aula/templates/reportTabs.html | 2 +
    aula/urls.py | 6 +
    aula/utils/menu.py | 12 +-
    aula/utils/templates/carregaInicial.html | 41 +-
    aula/utils/tools.py | 6 +-
    aula/utils/views.py | 43 +-
    demo/helpers/carrega.py | 3 +-
    demo/templates/base.html | 3 +
    demo/tmp/exportKrono.txt | 546 ++++++++++----------
    demo/tmp/exportSaga.txt | 390 +++++++-------
    docs/Wiki/.gitbook/assets/export.png | Bin 0 -> 9769 bytes
    docs/Wiki/instalacion-2/instalacion.md | 9 +-
    docs/Wiki/manual-de-uso/README.md | 4 +-
    docs/Wiki/manual-de-uso/carga-inicial-de-datos/README.md | 166 ++++--
    .../carga-de-horarios-aulas-y-asignaturas.md | 6 +-
    .../carga-profesores-y-franjas-horarias.md | 2 +
    .../configurar-estados-de-asistencia-y-tipos-de-asignatura.md | 2 +-
    .../creacion-de-niveles-cursos-y-grupos.md | 4 +-
    docs/Wiki/manual-de-uso/carga-inicial-de-datos/untitled.md | 3 +-
    docs/Wiki/manual-de-uso/primer-inicio.md | 5 +-
    docs/manuals/parametritzacions.txt | 22 +-
    "docs/presentaci\303\263-djau-2019.pdf" | Bin 0 -> 2378793 bytes
    requirements.txt | 3 +-
    93 files changed, 2544 insertions(+), 694 deletions(-)
    create mode 100644 aula/apps/alumnes/gestioGrups.py
    create mode 100644 aula/apps/alumnes/migrations/0010_alumne_foto.py
    create mode 100644 aula/apps/alumnes/migrations/0011_auto_20191002_1753.py
    create mode 100644 aula/apps/assignatures/migrations/0004_auto_20190922_2001.py
    create mode 100644 aula/apps/extUntis/init.py
    create mode 100644 aula/apps/extUntis/admin.py
    create mode 100644 aula/apps/extUntis/forms.py
    create mode 100644 aula/apps/extUntis/migrations/0001_initial.py
    create mode 100644 aula/apps/extUntis/migrations/0002_auto_20191014_1118.py
    create mode 100644 aula/apps/extUntis/migrations/init.py
    create mode 100644 aula/apps/extUntis/models.py
    create mode 100644 aula/apps/extUntis/sincronitzaUntis.py
    create mode 100644 aula/apps/extUntis/templates/sincronitzaUntis.html
    create mode 100644 aula/apps/extUntis/urls.py
    create mode 100644 aula/apps/extUntis/views.py
    create mode 100644 aula/apps/horaris/migrations/0005_auto_20191009_1056.py
    create mode 100644 aula/apps/presencia/migrations/0007_auto_20191013_1307.py
    create mode 100644 aula/apps/presencia/migrations/0008_auto_20191020_0114.py
    create mode 100644 aula/apps/relacioFamilies/templates/configuraConnexio.html
    create mode 100644 aula/apps/sortides/migrations/0014_auto_20191027_1228.py
    create mode 100644 aula/apps/usuaris/migrations/0004_auto_20190924_1045.py
    create mode 100644 aula/apps/usuaris/migrations/0004_dadesadicionalsprofessor.py
    create mode 100644 aula/apps/usuaris/migrations/0005_auto_20190922_2001.py
    create mode 100644 aula/apps/usuaris/migrations/0006_auto_20191013_1050.py
    create mode 100644 aula/apps/usuaris/migrations/0007_merge_20191023_1150.py
    create mode 100644 aula/apps/usuaris/migrations/0008_auto_20191027_1228.py
    create mode 100644 aula/apps/usuaris/templates/integraCalendari.html
    create mode 100644 aula/site-css/nofoto.png
    create mode 100755 docs/Wiki/.gitbook/assets/export.png
    create mode 100644 "docs/presentaci\303\263-djau-2019.pdf"
    djau2019@freser:/opt/djau2019$ source venv/bin/activate
    (venv) djau2019@freser:/opt/djau2019$ python manage.py migrate
    Traceback (most recent call last):
    File "manage.py", line 15, in
    execute_from_command_line(sys.argv)
    File "/opt/djau2019/venv/lib/python3.6/site-packages/django/core/management/init.py", line 381, in execute_from_command_line
    utility.execute()
    File "/opt/djau2019/venv/lib/python3.6/site-packages/django/core/management/init.py", line 357, in execute
    django.setup()
    File "/opt/djau2019/venv/lib/python3.6/site-packages/django/init.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
    File "/opt/djau2019/venv/lib/python3.6/site-packages/django/apps/registry.py", line 91, in populate
    app_config = AppConfig.create(entry)
    File "/opt/djau2019/venv/lib/python3.6/site-packages/django/apps/config.py", line 90, in create
    module = import_module(entry)
    File "/usr/lib/python3.6/importlib/init.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
    File "", line 994, in _gcd_import
    File "", line 971, in _find_and_load
    File "", line 953, in _find_and_load_unlocked
    ModuleNotFoundError: No module named 'private_storage'

Afegir franjes horaries a la pantalla de presencia aula

;* [x] Necessito ajuda tècnica per tal de modificar o posar en marxa el programa.

  • Necessito ajuda funcional per entendre alguna pantalla.

La pantalla de presència (on surt el quadre horari del professor) conté un nombre limitat de files (franges horàries). El meu problema és que jo actualment tinc 23 franges horàries i el cas que he capturat la imatge no surten totes les hores del seu horari a pantalla .

Adjunto la informació del fitxer d'horaris (podreu observar que les hores 16, 18 i 21 del dimecres ) no apareixen a la pantalla del djau i el fitxer si que hi són.

Com puc solucionar aquest problema?
camphoto_1804928587
camphoto_684387517

Proposta de Millora: Fotos alumnes

Possibilitat d'emmagatzemar les fotos dels alumnes

L'inici de curs és una setmana màgica, tot està per fer i tot és possible. Tanmateix és difícil aprendre en un dia tantes cares noves, a més, sempre hi ha nouvinguts de darrera hora a l'aula i les orles queden obsoletes d'un dia per l'altre. Seria meravellós que el djau ajudés a identificar els alumnes mitjançant la foto. També seria de gran ajuda a professors substituts que arriben a mig curs.

Descriu la solució que t'agradaria

Seria interessant disposar d'un botó "[ veure fotos dels alumnes ]" a la pantalla de presència. Així, de manera opcional, podríem visualitzar, al costat dels noms, les cares dels alumnes només quan fos necessari.

Idees:

  • Que les fotos les "mantinguin" els tutors. Amb un portàtil del centre el tutor podria fer les fotos dels alumnes directament des del djau i modificar-les sempre que fos necessari.
  • Fer projecte semblant al DIY del fotomaton de l'escola del treball ( moderat pel tutor )
  • Que els alumnes / famílies des de casa poguessin amb el djau mantenir la foto ( moderat pel tutor ) Aquest darrer cas provocaria fotos no homogènies.

Valor afegit:

  • El djau podria confeccionar les orles.
  • Ja posats, es podria estendre la idea cap als professors. I que aquests triessin qui pot veure la foto:
    • Tothom que ha fet login.
    • Els professors.
    • Els professors i les famílies ( al portal famílies )

Alternatives
Tots els comentaris són benvinguts.

Context addicional
Tots els comentaris són benvinguts.

Cal tenir en compte
Les fotos dels alumnes han d'estar protegides. Només hauria de tenir accés a la foto de l'alumne:

  • Els tutors i professors que tenen aquest alumne.
  • Els grups psicopedagogs i direcció.
  • La família de l'alumne.

Recordeu que existeix el URL Hacking que consisteix a canviar un numeret a la url i veure que passa, imaginem que tenim una url com aquesta:

https://llocxungo.com/scripts/imatge_persona.php?id_per=19

Ni pot ser que algú canviant el 19 per un altre número vagi veient totes les fotos del centre!

Problema en imprimir reports (.odt)

Problema en imprimir reports (.odt)

Si s'intenta generar un report (per exemple el corresponent a la impresió dels fulls de pagament d'una sortida)
imagen

es produeix un error de codificació

Internal Server Error: /sortides/imprimir/7/4

UnicodeEncodeError at /sortides/imprimir/7/4
'ascii' codec can't encode character '\xe0' in position 29: ordinal not in range(128)
Request Method: GET
Request URL: https://blablablas.net/sortides/imprimir/7/4
Django Version: 2.2.5
Python Executable: /usr/bin/python3
Python Version: 3.6.8

L'error és molt clar i típic en un traspàs de Pyton2 a 3: problema amb algun caràcter en català.

Traceback:

File "/a/venv/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
34. response = get_response(request)

File "/a/venv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
115. response = self.process_exception_by_middleware(e, request)

File "/a/venv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
113. response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/a/venv/lib/python3.6/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
21. return view_func(request, *args, **kwargs)

File "/a/aula/utils/decorators.py" in inner_decorator
17. return func(request, *args, **kwargs)

File "/a/aula/apps/sortides/views.py" in imprimir
127. renderer.run()

File "/a/venv/lib/python3.6/site-packages/appy/pod/renderer.py" in run
451. self.currentParser.parse(self.contentXml)

File "/a/venv/lib/python3.6/site-packages/appy/xml/init.py" in parse
273. self.parser.parse(inputSource)

File "/usr/lib/python3.6/xml/sax/expatreader.py" in parse
111. xmlreader.IncrementalParser.parse(self, source)

File "/usr/lib/python3.6/xml/sax/xmlreader.py" in parse
125. self.feed(buffer)

File "/usr/lib/python3.6/xml/sax/expatreader.py" in feed
217. self._parser.Parse(data, isFinal)

File "../Modules/pyexpat.c" in StartElement
419.

File "/usr/lib/python3.6/xml/sax/expatreader.py" in start_element
333. self._cont_handler.startElement(name, AttributesImpl(attrs))

File "/a/venv/lib/python3.6/site-packages/appy/pod/pod_parser.py" in startElement
266. e.currentBuffer.dumpStartElement(elem, attrs)

File "/a/venv/lib/python3.6/site-packages/appy/pod/buffers.py" in dumpStartElement
166. self.write(' %s=%s' % (name, quoteattr(value)))

File "/a/venv/lib/python3.6/site-packages/appy/pod/buffers.py" in write
215. self.content.write(something)

Podría ser problema del apy pod utilitzat per generar el fitxer .odt?

El problema apareix amb el djAu executant-se en un Ubuntu Server 18.04LTS (language = ca_ES), en canvi no s'ha pogut reproduir l'error (funciona perfectament) en un Xubuntu 18.04 (language = ca_ES).

Any idea¿¿??

Error al fer les altes al dJau

Em dona error al carregar fitxer de alumnes de saga al djau.
L'error que em dona és el següent

Request Method: POST
https://ca.iesnx.cat/extSaga/sincronitzaSaga/
2.2.3
StopIteration
/opt/djau2019/aula/apps/extSaga/sincronitzaSaga.py in comprovar_grups, line 354
/opt/djau2019/venv/bin/python
3.6.8
['/opt/djau2019', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/opt/djau2019/venv/lib/python3.6/site-packages']
dv., 13 Set. 2019 10:19:46 +0200

Proposta de Millora: Gestió de les notificacions

NOTIFICACIONS

Els tutors també es queixa d’accés de notificacions, haurem de pensar com s’han d’organitzar… o grup de professors que proposin:

Separació de les notificacions en grups/pestanyes::

  • ADMINISTRACIÓ: missatges sobre errors, actualitzacions, han passat llista per tú.
  • MISSATGERIA: queden fora, inclosos a l’apartat de missatgeria (entre profes, profes-PAS, tutors-famílies…)
  • ACTIVITATS notificacions sobre sortides-activitats que afecten al teus alumnes, acompanyant, organització.
  • DISCIPLINA: incidències, expulsions i que impliquen alguna acció del professors i tutor
  • INFORMATIVES DISCIPLINA: informació disciplina i assistència d’alumnes que tens a classe o ets tutors

Missatges d’administració:

  • Error enviant notificacions relació famílies. ( 'VI' )
  • Reprogramació de classes finalitzada. ( 'VI' if len( errors )> 0 else 'IN' )
  • Error sincronitzant sortides. VI
  • Sincronitza Kronowin: Actualització d'horaris realitzada, recorda reprogramar les classes.
  • Sincronitza Saga: El següents alumnes han estat donats de baixa.
  • Sincronitza Saga: 'El següents alumnes han estat canviats de grup.
  • Sincronitza Saga: El següents alumnes han estat donats d'alta.
  • Missatge a administradors: Avís d'error al programa:
  • Missatge a usuari que ha enviat missatge a administradors: Avís a administradors enviat correctament

Missatges a professors:

Missatgeria
  • Missatge a tutors des de consergeria:Missatge relatiu a un teu alumne tutorat
  • Missatge des de consergeria al conserge conforme ha enviat em msg: Enviat avís a tutors de l'alumne ( queda marcat com a llegit per tal que no faci nosa )
  • Missatge a professors o pas:
  • Missatge conforme el missatge s’ha enviat correctament: Missatge a {destinataris} enviat correctament
Activitats
  • Missatge quan t’afegeixen d’acompanyant a una sortida: Has estat afegit com a professor acompanyant a l'activitat {sortida}
  • Missatge quan t’afegeixen de responsable a una sortida: "Has estat afegit com a professor responsable a l'activitat {sortida}
Administració
  • Missatge quan afegeixes alumnes a una classe amb errors: Fi procés afegir alumnes a … Procés finalitzat amb errors. S'ha enviat incidència als administradors
  • Missatge quan treus alumnes a una classe amb errors: Fi procés afegir alumnes a … Procés finalitzat amb errors. S'ha enviat incidència als administradors
  • Missatge quan passa llista a una classe que no és la teva: Has passat llista a un grup que no és el teu: ({0}). El professor del grup {1} rebrà un missatge com aquest.
  • Missatge que rep el professor quan algú li passa llista a la seva classe: Ha passat llista d'una classe on consta que la fas tú: ({0})
Disciplina
  • Missatge quan poses incidència a un alumne i n’acumula 3: A l'alumne {0} ja li has posat {1} incidències en els darrers {2} dies. Segons la normativa del Centre hauries de tramitar una expulsió per acumulació d'incidències.
  • Missatge al tutor quan poses incidència fora d’aula a un alumne i n’acumula 3: l'alumne {0} li han posat {1} incidències gestionades pel tutor en els darrers {2} dies. Segons la normativa del Centre, com a tutor de l'alumne, hauries de tramitar una expulsió per acumulació d'incidències.
  • Missatge al professor que expulsa quan un professor recull expulsió: 'Cal tramitar expulsió:
  • Missatge al professor que recull expulsió: ha recollit la següent expulsió: {0}
Informatives disciplina
  • Missatge a tots els professors que tenen aquest alumne a l’aula: (text de l’expulsió)
  • Missatge als professors que tenen un alumne que ha estat sancionat: L'alumne {0} ha estat sancionat ( del {1} al {2} ).
  • Missatge als tutors quan es posa incidència a un alumne (en el cas de cicles és a tots els professors que el tenen a classe): Ha posat una incidència {0}a {1} ({2}) el dia {3}. El text de la incidència és: {4}

NOVES PROPOSTES NOTIFICACIONS

Administració
  • Quan un professor no ha passat llista a algun grup, per exemple per descuit, l'endemà podria rebre un avís de recordatori.
  • Quan el professor de guàrdia deixa comentaris a l'apartat "Comentaris professor guàrdia", es podria generar un avís al professor absent (tal com està ara, s'ha d'anar hora per hora a mirar que el professor de guàrdia no hagi deixat cap comentari...)
  • Notificacions alumnes bilocat per els 2 professors que li han passat llista a la mateixa hora a assignatures del mateix curs: “El professor X també ha passat llista a aquest alumne/a en aquesta franja a una matèria de 4t ESO (o de 1r DAW o el que sigui). Revisa si l’alumne ha de ser a la teva llista (enllaç a passar llista a aquella hora per a que comprovi)
Informatives disciplina
  • Quan Psicopedagog fa una actuació sobre algun alumne, es podria generar un avís amb l'enllaç de l'actuació al tutor, ja que de la manera que està actualment és poc pràctic i molt sovint es fan actuacions que queden "invisibles".
  • Quan s’esborra des de Cap d’Estudis o administrador alguna actuació, sanció, expulsió,incidència el tutor de l’alumne i professor que l’ha posada hauria de rebre missatge.

NOVES PROPOSTES A ESTUDIAR

  • Estat de les Notificacions: per saber quines has revisat i quines et falta per fer alguna acció. (potser un canvi de color de text)
  • Un apartat on es pugui veure totes les incidències/expulsions només del grup de tutoria.

( Nota: relacionat amb missatgeria #28 )

Com puc exportar dades del djau?

Es poden exportar dades des de la base de dades o des de la shell de django.

Exemple 1: Com puc exportar els correus dels responsables legals de l'alumne?

Exemple des de la shell de django.

from aula.apps.alumnes.models import Alumne

for a in Alumne.objects.all():
    print ( a.rp1_correu, a.rp2_correu)  # fer servir XlsxWriter per exportar a excel

Exemple des de la base de dades:

select rp1_correu, rp2_correu 
from alumnes_alumne;

El django-aula és programari lliure, pots mirar al codi tots els models de dades, com estan relacionats així com les dades que emmagatzemen.

Exemple 2: Com puc exportar l'usuari del portal famílies?

from aula.apps.alumnes.models import Alumne

for a in Alumne.objects.all():
    user_associat = a.get_user_associat()
    usuari = user_associat.username if user_associat else ""
    print ( a.cognoms, a.nom, usuari )  

Necessites més ajuda?

Necessites ajuda per alguna exportació concreta? Pots obrir una issue.

"Nom Sentit" alumne

Motivació

Hi ha alumnes en tràmits de canviar-se el nom. En alguns casos és convenient usar el nou nom de l'alumne tot i que encara, aquest, no és oficial. L'equip directiu i/o psico ho pot determinar. A aquest nom l'anomenarem (fins a trobar un millor identificador) NomAula (el nom de l'alumne que cal usar a l'aula) NomSentit.

Proposta

A les pantalles i documents on el nom no té per què ser el nom que figura al DNI de l'alumne, es podria mostrar el "Nom Sentit". A comunicats oficials ( ex: permís sortida, ... ) ha d'aparèixer el nom oficial.

Només l'equip directiu i/o psico pot canviar el nom Sentit.

Notes

Validar la denominació "Nom Sentit".

Context addicional

Cal ser sensibles amb aquest tema.

Portal de famílies i activitats

  • Necessito ajuda funcional per entendre alguna pantalla.

He creat una activitat, he seleccionat els alumnes i tinc les autoritzacions i pagaments.
L'estat de l'activitat és "Revisada pel Coordinador", també està aprovada pel consell escolar.
Al portal de famílies no surt l'activitat, l'apartat "Activitats/Sortides" surt en blanc.
No sé que m'he deixat per a que les famílies puguin veure l'activitat al portal.

Salutacions i gràcies.

Vull modificar quan salta avis per faltes

Avui salta avis de faltes quan han fet 3 faltes. Volíem modificar de manera que salti a 4 i si podem modificar-ho , que no sigui per faltes sinó per un determinat tipus de incidència (Faltes greus o lleus).
Volia saber on està aquest paràmetre (el que diu que sigui a les 3 vegades) i on es fa el recompte per a veure si podem canviar per aquest tipus de incidència en lloc de les faltes

Moltes gràcies

Informa quin tipus d'ajuda necessites:

  • Necessito ajuda técnica per tal de modificar o posar en marxa el programa.
  • Necessito ajuda funcional per entendre alguna pantalla.

Proposta de Millora: Integració traspàs del curs anterior

Problema.

djAu no és multi-curs. Això fa que, si es vol tenir dades del curs anterior, s'hagi de fer un 'Resum' i traspassar aquestes dades al curs actual.

  • Aquest traspàs és força manual.
  • La consulta de les actuacions traspassades apareix com a Històric.

imagen

Proposta

  • Integrar el procés de traspàs al djAu
  • Integrar les actuacions traspassades al nou curs

imagen

Permetre al justificador assignar presència

El justificador utilitzat pels tutors no permet passar una Falta a l'estat "Present".
Es dóna el cas de que alguns professors s'equivoquen, posen faltes i després les ha de passar el tutor a l'estat "Present"

Model actuació no té verbose name (faltes ortografia)

Descriu el problema

Model actuació no té verbose name ( etiquetes ) , falten accents.

Passes per reproduir-ho

  1. Entrar com a tutor.
  2. Anar a la pantalla actuacions.

Comportament esperat

Evitar faltes ortografia. Posar verbose names:

moment_actuacio = models.DateTimeField("Moment de l'actuació", 
                                       help_text=u"Data i Hora de l'a...

Captures de pantalla

selection_407

Informació adicional

Codi aquí: https://github.com/ctrl-alt-d/django-aula/blob/master/aula/apps/tutoria/abstract_models.py#L67

Error

N/A. No provoca que l'aplicació peti.

Traces

N/A

Problema per mostrar tot l'horari d'un professor amb més de 13 franges horàries

Al carregar un horari de professor amb més de 13 franges horàries (nombre limitat de files que apareix a la pantalla d'aula - presencia) que apareixen a la pantalla aula - presencia (que mostra l'horari del professor). En aquest cas tinc un professor que ha de disposar de 18 o 20 línies (franges horàries ) per mostrar el seu horari complert durant la setmana.

  1. Hem generat el fitxer d'horaris del centre amb els dies, hores de cada professor/a amb el format: "assignatura" "profe" "grup" "M" "nivell" "1" "A" "aula" "unk2" "dia" "hora" "unk3"
  2. He fet la càrrega de dades i no dóna cap tipus d'error
  3. He reprogramat i tot correcte
  4. Un cop he carregat les dades faig impersonalització com aquell professor.
  5. No apareix el seu horari sencer

*Comportament esperat

Hauria d'haver aparegut tot l'horari del professor.

fixter_horari
presencia_djau

Informació addicional

En el meu centre per fer servir el programa de seguiment d'assistència de l'alumnat he hagut de crear 23 franges horàries. Aquest és el cas més singular per què té més de 13 (límit de la pantalla).

[BUG]

Atenció! No incloure dades sensibles en aquest formulari.

Em dona problema al carregar fotos d'alumnes.
Sembla que es queixa de permisos a /alumnes.
Tota l'aplicació té com a propietari djau2019 i grup www-data.

Passes per reproduir-ho

Em passa al intentar carregar una foto d'un alumne. Qualsevol.
1 Vaig a portal
2 Li demano per carregar foto
3. La selecciono
4 Dono a enviar dades
5 veig error

En mode DEBUG el que dona és el que poso a continuació:

Request Method: POST
https://ca.iesnx.cat/open/configuraConnexio/17/
2.2.3
PermissionError
[Errno 13] S’ha denegat el permís: '/alumnes'
/usr/lib/python3.6/os.py in makedirs, line 220
/opt/djau2019/venv/bin/python
3.6.8
['/opt/djau2019', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/opt/djau2019/venv/lib/python3.6/site-packages']
dc., 6 Nov. 2019 23:54:13 +0100

Environment:

Request Method: POST
Request URL: https://ca.iesnx.cat/open/configuraConnexio/17/

Django Version: 2.2.3
Python Version: 3.6.8
Installed Applications:
['customising',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
'django_extensions',
'django_tables2',
'django.contrib.humanize',
'aula.apps.missatgeria',
'aula.apps.alumnes',
'aula.apps.assignatures',
'aula.apps.horaris',
'aula.apps.presencia',
'aula.apps.incidencies',
'aula.apps.tutoria',
'aula.apps.extKronowin',
'aula.apps.extSaga',
'aula.apps.extEsfera',
'aula.apps.avaluacioQualitativa',
'aula.apps.todo',
'aula.apps.usuaris',
'aula.apps.relacioFamilies',
'aula.apps.sortides',
'aula.apps.baixes',
'aula.apps.BI',
'aula.apps.aules',
'aula.utils',
'aula.apps.presenciaSetmanal',
'aula.apps.extUntis',
'private_storage']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'aula.utils.middleware.MultipleProxyMiddleware',
'aula.utils.middleware.NoCacheMiddleware',
'aula.utils.middleware.timeOutMiddleware',
'aula.utils.middleware.IncludeLoginInErrors']

Traceback:

File "/opt/djau2019/venv/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
34. response = get_response(request)

File "/opt/djau2019/venv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
115. response = self.process_exception_by_middleware(e, request)

File "/opt/djau2019/venv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
113. response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/opt/djau2019/venv/lib/python3.6/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
21. return view_func(request, *args, **kwargs)

File "/opt/djau2019/aula/utils/decorators.py" in inner_decorator
17. return func(request, *args, **kwargs)

File "/opt/djau2019/aula/apps/relacioFamilies/views.py" in configuraConnexio
204. form.save()

File "/opt/djau2019/aula/apps/relacioFamilies/forms.py" in save
42. super(AlumneModelForm, self).save()

File "/opt/djau2019/venv/lib/python3.6/site-packages/django/forms/models.py" in save
458. self.instance.save()

File "/opt/djau2019/venv/lib/python3.6/site-packages/django/db/models/base.py" in save
741. force_update=force_update, update_fields=update_fields)

File "/opt/djau2019/venv/lib/python3.6/site-packages/django/db/models/base.py" in save_base
779. force_update, using, update_fields,

File "/opt/djau2019/venv/lib/python3.6/site-packages/django/db/models/base.py" in _save_table
848. for f in non_pks]

File "/opt/djau2019/venv/lib/python3.6/site-packages/django/db/models/base.py" in
848. for f in non_pks]

File "/opt/djau2019/venv/lib/python3.6/site-packages/django/db/models/fields/files.py" in pre_save
288. file.save(file.name, file.file, save=False)

File "/opt/djau2019/venv/lib/python3.6/site-packages/django/db/models/fields/files.py" in save
87. self.name = self.storage.save(name, content, max_length=self.field.max_length)

File "/opt/djau2019/venv/lib/python3.6/site-packages/django/core/files/storage.py" in save
52. return self._save(name, content)

File "/opt/djau2019/venv/lib/python3.6/site-packages/django/core/files/storage.py" in _save
242. os.makedirs(directory)

File "/usr/lib/python3.6/os.py" in makedirs
210. makedirs(head, mode, exist_ok)

File "/usr/lib/python3.6/os.py" in makedirs
220. mkdir(name, mode)

Exception Type: PermissionError at /open/configuraConnexio/17/
Exception Value: [Errno 13] S’ha denegat el permís: '/alumnes'

SAGA a Esfer@

Cal fer el nou mòdul ext_esfera.

Hi ha diversos canvis a tenir en compte:

  • Ara el fitxer és un XSLX (això no és problema perquè tenim la dependència XlsxWriter que ens ho soluciona) cal instal·lar openpyxl.
  • Ara no s'importen tots els alumnes de cop. Per tant, el primer pas del procés d'importació serà mirar quins Nivells estem important i fer inserts i actualitzacions com sempre, però només baixes dels nivells que importem ( això tant a ext_saga com a ext_esfera )
  • Hi ha camps disgregats que ens van bé, per exemple a alumne ja estem guardant a djau nom i cognom per separat tot i que al SAGA arriban junts. Però hi ha camps agregats que haurem de desagregar ( els contactes dels representants legals del menor )

Seria ideal disposar d'un XLSX amb dades FAKE però amb tots els casos contemplats.

Informació proporcionada pel Cendrassos:

Per a l' ESO i el BTX ha deixat de funcionar SAGA, i hem passat a Esfer@. He estat provant quins llistat es poden extreure d'Esfer@ per poder importar alumnes a DJAU. En Quim S. ens passa aquest document amb la comparativa llistat SAGA-llistat Esfer@. Malauradament, les dades dels responsables legals no estan disgregades.

En aquests moments el DJAU treballa amb els fitxer CSV que tenen els següents camps i que s’extreu de SAGA::

        "00_IDENTIFICADOR DE L'ALUMNE/A",
	"01_NOM",
	"02_DATA NAIXEMENT",
	"03_RESPONSABLE 1",
	"04_TELÈFON RESP. 1",
	"05_MÒBIL RESP. 1",
	"06_ADREÇA ELECTR. RESP. 1",
	"07_RESPONSABLE 2",
	"08_TELÈFON RESP. 2",
	"09_MÒBIL RESP. 2",
	"10_ADREÇA ELECTR. RESP. 2",
	"11_ADREÇA",
	"12_LOCALITAT",
      	 "13_MUNICIPI",
	"14_CORREU ELECTRÒNIC",
	"15_ALTRES TELÈFONS",
	"16_CENTRE PROCEDÈNCIA",
	"17_GRUPSCLASSE"

En canvi d’Esfera@, la llista més semblant en format XLSX (les treu en aquest format) que he pogut treure:

Identificador de l’alumne/a (25)
Primer Cognom (20)
Segon Cognom (20)
Nom (20)
Data naixement (20)
Tutor 1 - 1r cognom (20)
Tutor 1 - 2n cognom (20)
Tutor 1 - nom (20)
Contacte 1er tutor alumne - Valor (20)
Tutor 2 - 1r cognom (20)
Tutor 2 - 2n cognom (20)
Tutor 2 - nom (20)
Contacte 2on tutor alumne - Valor (20)
Tipus de via (15)
Nom via (20)
Número (15)
Bloc (15)
Escala (15)
Planta (15)
Porta (15)
Codi postal (15)
Localitat de residència (20)
Municipi de residència (20)
Correu electrònic (20)
Contacte altres alumne - Valor (20)
Grup Classe (20)

El problema que ens trobem és que des d’Esfer@ no podem obtenir els mateixos camps, i per tant dificulta la importació dels alumnes fins que no unifiquem a Esfer@ Cicles, Btx i ESO... (i en tenim per uns quants cursos)

LLISTA ESFER@ SAGA OBSERVACIONS
Identificador de l’alumne/a (25) 00_IDENTIFICADOR DE L'ALUMNE/A IGUAL
Primer Cognom (20) 01_NOM Caldrà unir els camps abans d'ajuntar els fitxers, o preparar el DJAU per camps separats (però després els problemes seran pel SAGA)
Segon Cognom (20)
Nom (20)
Data naixement (20) 02_DATA NAIXEMENT IGUAL
Tutor 1 - 1r cognom (20) 03_RESPONSABLE 1 Caldrà unir els camps abans d'ajuntar els fitxers, o preparar el DJAU per camps separats (però després els problemes seran pel SAGA)
Tutor 1 - 2n cognom (20)
Tutor 1 - nom (20)
Contacte 1er tutor alumne - Valor (20) 04_TELÈFON RESP. 1 Per esfer@ surten telèfons i mails al mateixa camp separats per espai-guionet-espa, i ordre diferent.  Serà complicat
05_MÒBIL RESP. 1
06_ADREÇA ELECTR. RESP. 1
Tutor 2 - 1r cognom (20) 07_RESPONSABLE 2 Caldrà unir els camps abans d'ajuntar els fitxers, o preparar el DJAU per camps separats (però després els problemes seran pel SAGA)
Tutor 2 - 2n cognom (20)
Tutor 2 - nom (20)
Contacte 2on tutor alumne - Valor (20) 08_TELÈFON RESP. 2 Per esfer@ surten telèfons i mails al mateixa camp separats per espai-guionet-espa, i ordre diferent.  Serà complicat
09_MÒBIL RESP. 2
10_ADREÇA ELECTR. RESP. 2
Tipus de via (15) 11_ADREÇA Caldrà unir els camps abans d'ajuntar els fitxers, o preparar el DJAU per camps separats (però després els problemes seran pel SAGA)
Nom via (20)
Número (15)
Bloc (15)
Escala (15)
Planta (15)
Porta (15)
Localitat de residència (20) 12_LOCALITAT IGUAL
Municipi de residència (20) 13_MUNICIPI IGUAL
Correu electrònic (20) 14_CORREU ELECTRÒNIC IGUAL
Contacte altres alumne - Valor (20) 15_ALTRES TELÈFONS IGUAL
  16_CENTRE PROCEDÈNCIA Per obtenir-lo des d'Esfer@ s'ha de fer un altre llistat i després caldrà copiar/enganxar columna
Grup Classe (20) 17_GRUPSCLASSE IGUAL

Exemple de com disgregar dades amb python:

def dades_responsable ( dades ):
    splitted = dades.split(" - ")
    mails = [ dada for dada in splitted if "@" in dada ]
    fixes = [ dada for dada in splitted if dada.startswith("9") and dada not in mails ]
    mobils =[ dada for dada in splitted if dada not in mails+fixes ] 

    diccionari = { "mails": mails,
                   "fixes": fixes,
                   "mobils": mobils,
                 }
    return diccionari

print dades_responsable( "600016010 - 666780110 - [email protected] - [email protected]" )
print dades_responsable( "123123123" )

Try it online!

Proposta de Millora: Mòdul de missatgeria

Transcric petició de nova funcionalitat per obrir debat. És una proposta. Tots els comentaris són benvinguts.

Missatgeria

Els tutors demanen un sistema de comunicació amb els pares al DJAU... del correu electrònic no se'n fien (és més fàcil que ho vegin al DJAU). De moment fan servir l'apartat observacions però com que va lligat amb les hores de classe no va gaire bé, a més el pares no poden respondre.

Per tant, ens caldria un sistema de missatgeria entre tutors-famílies:

  1. El tutor ha de poder seleccionar un, diversos o tots els alumnes del seu grup per enviar un missatge a les famílies-
  2. Les famílies han de poder enviar missatge al tutor del seu fill.

Suposo que s'hauria de posar dins el menú de tutoria, però no sé si és possible de fer un nou menú MISSATGERIA (o dins AVISOS i AJUDA) amb les diferents opcions segons tipus d'usuaris dins el menú, i separar els missatges de les notificacions d'incidències...

La proposta seria que dins el nou menú MISSATGERIA els PROFESSORS hi tinguessin la pestanyes:

  • MISSATGES A PROFESSORAT I PAS
  • AVISOS DE SEGURETAT,
  • LLISTAT DE MISSATGES: així queden separats de les notificacions.
  • LLISTAT DE NOTIFICACIONS: guàrdies, incidències, observacions, sancions… separades en grups

La proposta seria que dins el nou menú MISSATGERIA els TUTORS hi tinguessin la pestanyes:

  • MISSATGES A PROFESSORAT I PAS
  • MISSATGES A FAMÍLIES
  • AVISOS DE SEGURETAT,
  • LLISTAT DE MISSATGES: així queden separats de les notificacions.
  • LLISTAT DE NOTIFICACIONS: guàrdies, incidències, observacions, sancions… separades en grups...

La proposta seria que dins el nou menú MISSATGERIA les FAMÍLIES hi tinguessin la pestanyes:

  • MISSATGES AL TUTOR
  • AVISOS DE SEGURETAT
  • LLISTAT DE MISSATGES: així queden separats de les notificacions.

Potser millor que un sistema clàssic de missatgeria (format email) seria millor una AGRUPACiÓ per converses ( estil fils de twitter )

( Relacionat amb Notificacions #29 )

Error quan s'Assigna els grups del Saga al programa si hi ha espais al final [BUG]

Atenció! No incloure dades sensibles en aquest formulari.

Descripció el problema
Després de fer la primera assignació, torna a demanar assigancions de grups de SAGA de grups ja assignats i quan s'assignen diu que ja estan assignats.
El problema es produeix quan al fitxer extret de SAGA, el nom dels grups tenen un espai al final.
P.exemple "SMX 1A "

Passes per reproduir-ho

  1. A l'apartat Admin, càrrega inicial.
  2. Es realitza el pas número 4. Importa alumnes SAGA amb un fitxer on un dels grups té espais al final.
  3. Es realitza el pas número 5
  4. Al tornar a fer la càrrega (pas número 6. Importa alumnes SAGA) i ens demana que fem l'assignació (tornar al pas número 5)

Informació adicional
S'hauria d'eliminar els espais finals en els noms dels grups, en els móduls d'importació.

No apareixen totes les aules reservables quan es fa reserva a través de franja horària

Si es fa una reserva d'aula a través de l'assistent de la tria d'aula, es pot reservar un aula :

imagen

Si es fa la reserva a través de l'assistent de la tria de franja horària, l'aula reservable no apareix:

imagen



El problema es reprodueix en pràcticament totes les aules.
Realitzant consultes des de la shell, es comprova que l'exclusió de les aules afectades es realitza a la línia 278 (i es fa efectiva a la línia 282) d'aquest fitxer:
https://github.com/ctrl-alt-d/django-aula/blob/master/aula/apps/aules/views.py

imagen

S'ha comprovat que les aules que sí apareixen com a reservables (no queden excloses) són aules amb només una reserva asociada en aquell dia. Tenint en compte aquesta casuística, s'ha intentat intentat reproduir l'error en un altre entorn sense èxit.

Com es fa per posar camps en les cartes?

Volia saber com es fa per a posar camps en les cartes, de manera que aparegui automàticament el nom de l'alumne o altres informacions.
Veig alguna carta que ja porta camps però no veig com es poden crear/modificar

Moltes gràcies

Proposta de Millora: Informació alumnes =>18 anys

Obro aquesta issue com a debat per avaluar on creieu que seria millor mostrar aquesta informació.

Jo he creat un canvi en presencia per tal que ho mostri a nivell de professorat, al passar llista.

Però potser és més interessant que ho mostri a nivell de tutor.

Justificador, no apareixen tots els controls d'assistència de l'alumne.

S'han detectat problemes a la funció justificadorMKTable no ompla les dades correctament.

Aquesta funció l'hem de reescriure amb aquests criteris:

  • Primer ha de llegir tots els alumes tutorats.
q_grups_tutorats = Q( grup__in =  [ t.grup for t in professor.tutor_set.all() ] )
q_alumnes_tutorats = Q( pk__in = [ti.alumne.pk 
                                  for ti in professor.tutorindividualitzat_set.all() ]  )
alumnes = Alumne.objects.filter( q_grups_tutorats | q_alumnes_tutorats )
  • Després a de llegir tots els controls d'assistència dels alumnes tutorats, juntament amb la resta de dades que es necessiten:
    #busco el dilluns i el divendres
    dia_de_la_setmana = data.weekday()
    delta = timedelta( days = (-1 * dia_de_la_setmana ) )
    dilluns = data + delta
    dies = [ dilluns + timedelta( days = delta ) for delta in  [0,1,2,3,4] ]
    q_controls = Q( impartir__dia_impartir__in = dies ) & \
                         Q( alumne__in = alumnes )
    controls = list ( ControlAssistencia
                           .objects
                           .select_related(
                                'estat', 
                                'estat_backup',
                                'impartir__horari',
                                'impartir__horari__assignatura',
                                'impartir__horari__hora',
                                'professor',
                                'professor_backup',
                             )
                           .filter( q_controls ) )
  • Un cop carregades totes les dades fer la taula que el template necessita. No fer cap accés més a la base de dades, tot des de memòria, sempre de de la llista de controls.
  • Per exemple per buscar les diferents franges horàries que cal incloure cada dia de la setmana (fixem-nos que podem prescindir també de dades.marc_horari[dia] ):
dades.dia_hores = tools.diccionari()
for delta in [0,1,2,3,4]:
    dia = dilluns + timedelta( days = delta )
    conjunt_hores = set(  [ ca.impartir.horari.hora 
                                        for ca in controls  #<-- sempre des de controls
                                        if ca.impartir.dia == dia] )
    llista_hores = sorted( list(conjunt_hores), key = lamba x: x.hora_inici ) )
    dades.dia_hores[dia] = llista_hores
  • Caldria minimitzar els canvis al template, però potser són necessaris perquè potser és més còmode tballar amb alumne que unicode(alumne) ( al dades.quadre[unicode(alumne)] ).

Exemple de problema:

Dia 2018-09-27 
Teoria
  08:15 a 09:15  alumne x -> professor A
  09:40 a 10:40  alumne x -> professor A
  10:40 a 11:40  alumne x -> professor B
  11:40 a 12:40  alumne x -> professor B
  13:00 a 14:00  alumne x -> Present Josep Oliveras Castella
  14:00 a 15:00  alumne x -> Present Josep Oliveras Castella
Calcul de justificadorMKTable
  09:40 a 10:40:   alumne x -> professor A
  1r Pati
  10:40 a 11:40
  11:40 a 12:40
  2nPati

Snipe per simular funció i provar el codi:

import itertools

from django.utils.html import escape
from django.utils.safestring import mark_safe

from aula.apps.incidencies.business_rules.expulsio import expulsio_despres_de_posar
from aula.apps.incidencies.table2_models import Table2_ExpulsionsPendentsTramitar, \
    Table2_ExpulsionsPendentsPerAcumulacio, Table2_ExpulsionsIIncidenciesPerAlumne
from aula.utils.widgets import DateTimeTextImput,DateTextImput
#templates
from django.template import RequestContext
from django.http import HttpResponse

#workflow
from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect

#auth
from django.contrib.auth.decorators import login_required
from aula.apps.usuaris.models import User2Professor, User2Professional, Accio, LoginUsuari, Professional, Professor
from aula.utils.decorators import group_required

#forms
from aula.apps.tutoria.forms import  justificaFaltesW1Form, informeSetmanalForm, seguimentTutorialForm, elsMeusAlumnesTutoratsEntreDatesForm

#helpers
from aula.utils import tools
from aula.apps.presencia.models import  ControlAssistencia, EstatControlAssistencia,Impartir
from django.utils.datetime_safe import  date, datetime
from datetime import timedelta
from aula.apps.tutoria.models import Actuacio, Tutor, SeguimentTutorialPreguntes,SeguimentTutorial, SeguimentTutorialRespostes, ResumAnualAlumne, CartaAbsentisme
from aula.apps.alumnes.models import Alumne, Grup, AlumneGrupNom
from django.forms.models import modelform_factory, modelformset_factory
from django import forms
from django.db.models import Min, Max, Q

#exceptions
from django.core.exceptions import ValidationError, NON_FIELD_ERRORS,ObjectDoesNotExist
from django.http import Http404
from aula.apps.horaris.models import FranjaHoraria, Horari
from aula.apps.incidencies.models import Incidencia, Expulsio
from aula.utils.tools import llista
from aula.apps.avaluacioQualitativa.forms import alumnesGrupForm
from aula.utils.forms import dataForm, ckbxForm, choiceForm
from aula.apps.avaluacioQualitativa.models import RespostaAvaluacioQualitativa
import json as simplejson
from django.core import serializers
from aula.apps.tutoria.reports import reportCalendariCursEscolarTutor
from aula.apps.tutoria.rpt_elsMeusAlumnesTutorats import elsMeusAlumnesTutoratsRpt
from aula.apps.tutoria.others import calculaResumAnualProcess
from aula.apps.tutoria.rpt_gestioCartes import gestioCartesRpt
from aula.apps.tutoria import report_carta_absentisme
from aula.apps.tutoria.report_carta_absentisme import report_cartaAbsentisme
from aula.apps.tutoria.rpt_totesLesCartes import totesLesCartesRpt
from django.core.urlresolvers import reverse
from aula.apps.sortides.models import Sortida
from aula.apps.sortides.table2_models import Table2_Sortides
from django_tables2.config import RequestConfig
from aula.utils.my_paginator import DiggPaginator
from aula.apps.tutoria.table2_models import Table2_Actuacions
from django.contrib.auth.models import User
from django.contrib import messages
from django.conf import settings


user = User.objects.get( username = "M1" )   #<--------------- posar aquí el codi de professor
professor = User2Professor(user)
data = date( year = 2018, month=9, day = 24 ) #<-------------- posar aquí el dia a comprovar
grups = Grup.objects.filter( tutor__professor = professor )

q_grups_tutorats = Q( grup__in =  [ t.grup for t in professor.tutor_set.all() ] )
q_alumnes_tutorats = Q( pk__in = [ti.alumne.pk for ti in professor.tutorindividualitzat_set.all() ]  )
alumnes = Alumne.objects.filter( q_grups_tutorats | q_alumnes_tutorats )

#busco el dilluns i el divendres
dia_de_la_setmana = data.weekday()
    
delta = timedelta( days = (-1 * dia_de_la_setmana ) )
dilluns = data + delta
    
#marc horari per cada dia
dades = tools.classebuida()
dades.alumnes = alumnes.order_by('grup', 'cognoms', 'nom' )
dades.c = []    #controls

dades.dia_hores = tools.diccionari()
dades.marc_horari = {}
for delta in [0,1,2,3,4]:
    dia = dilluns + timedelta( days = delta )
    q_grups = Q(grup__in = grups )
    q_alumnes = Q(grup__alumne__in = alumnes )
    q_impartir = Q( impartir__controlassistencia__alumne__in = alumnes )
    q_dies = Q(impartir__dia_impartir = dia)
    #forquilla = Horari.objects.filter( ( q_grups | q_alumnes ) & q_dies                                               
    forquilla = Horari.objects.filter( q_impartir & q_dies                                               
                            ).aggregate( desde=Min( 'hora__hora_inici' ), finsa=Max( 'hora__hora_inici' )  )
    if forquilla['desde'] and forquilla['finsa']:
        dades.marc_horari[dia] = { 'desde':forquilla['desde'],'finsa':forquilla['finsa']}
        dades.dia_hores[dia] = llista()
        for hora in FranjaHoraria.objects.filter( hora_inici__gte = forquilla['desde'],
                                                    hora_inici__lte = forquilla['finsa'] ).order_by('hora_inici'):
            dades.dia_hores[dia].append(hora)            


dades.quadre = tools.diccionari()
for alumne in dades.alumnes:
    dades.quadre[unicode(alumne)] = []
    for dia, hores in dades.dia_hores.itemsEnOrdre():
        hora_inici = FranjaHoraria.objects.get( hora_inici = dades.marc_horari[dia]['desde'] )
        hora_fi    = FranjaHoraria.objects.get( hora_inici = dades.marc_horari[dia]['finsa'] )
        q_controls = Q( impartir__dia_impartir = dia ) & \
                        Q( impartir__horari__hora__gte = hora_inici) & \
                        Q( impartir__horari__hora__lte = hora_fi) & \
                        Q( alumne = alumne )
        controls = [ c for c in ControlAssistencia.objects.select_related(
                            'estat', 'impartir__horari__assignatura','professor','estat_backup','professor_backup'
                            ).filter( q_controls ) ]
        for hora in hores:
            cella = tools.classebuida()
            cella.txt = ''
            hiHaControls = len( [ c for c in controls if c.impartir.horari.hora == hora] )>0
            haPassatLlista = hiHaControls and len( [ c for c in controls if c.estat is not None and c.impartir.horari.hora == hora] )>0
            cella.c = [ c for c in controls if c.impartir.horari.hora == hora]
            for item in cella.c:
                item.professor2show = item.professor or ( item.impartir.horari.professor if item.impartir.horari else ' ' ) 
                item.estat2show= item.estat or " "
            dades.c.extend(cella.c)
            if not hiHaControls:
                cella.color = '#505050'
            else:
                if not haPassatLlista:
                    cella.color = '#E0E0E0'
                else:
                    cella.color = 'white'
            if hora == hora_inici:
                cella.primera_hora = True
            else:
                cella.primera_hora = False
            dades.quadre[unicode(alumne)].append( cella )

alumne_m = next( x for x in dades.alumnes)
alumne = next(x for x in dades.quadre)    
quadre_alumne=dades.quadre[alumne]
dades.marc_horari[data]

dia_hora = [ (dia,hora) for dia, hora in dades.dia_hores.itemsEnOrdre() for hora in hores ]

alumne,filera = next( (x,y) for x,y in dades.quadre.itemsEnOrdre() )

dia_aux = date( year = 2001, month=1, day = 1 )
print "alumne:", alumne
for cella, (dia,hora) in zip(filera, dia_hora  ):
    if dia != dia_aux:
        dia_aux = dia
        print "Dia: ", dia
        print "Teoria"
        a=Alumne.objects.get( cognoms = alumne.split(",")[0] )
        for ca in a.controlassistencia_set.filter( impartir__dia_impartir = dia ).order_by("impartir__horari__hora").all():
            print "  " + unicode( ca.impartir.horari.hora ) + "  " + unicode(ca) + " " + unicode(ca.impartir.horari.professor)
        print "Calcul de justificadorMKTable"
    for ca in cella.c:
        print "  " + unicode(hora) + " "  unicode(ca) + " " + unicode(ca.impartir.horari.professor)

datetime.datetime(2015, 2, 19, 17, 47, 43, 29120) is not JSON serializable

Hola,

Estic intentat instal·lar l'aplicació sota Ubuntu 14 LTS seguint la documentació i un cop faig el login, m'apareix aquest error:

TypeError at /

datetime.datetime(2015, 2, 19, 17, 47, 43, 29120) is not JSON serializable

Request Method: GET
Request URL: http://192.168.0.66:8000/
Django Version: 1.6
Exception Type: TypeError
Exception Value:

datetime.datetime(2015, 2, 19, 17, 47, 43, 29120) is not JSON serializable

Exception Location: /usr/lib/python2.7/json/encoder.py in default, line 184
Python Executable: /usr/bin/python
Python Version: 2.7.6
Python Path:

['/var/django-aula-master',
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-x86_64-linux-gnu',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old',
'/usr/lib/python2.7/lib-dynload',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages']

Server time: dj., 19 Feb. 2015 17:47:43 +0100

Teniu idea del que pot ser ? Sota quin SO es recomanable instal·lar-ho ?

Com puc comprovar que els missatges d'incidències funcionen? Hi ha pares que no rebem missatges.

Atenció! No incloure dades sensibles en aquest formulari.

Informa quin tipus d'ajuda necessites:

  • Necessito ajuda técnica per tal de modificar o posar en marxa el programa.
  • Necessito ajuda funcional per entendre alguna pantalla.

Explica que tens fet fins ara:
Explica que tens desenvolupat i en quin punt estàs encallat. Quant més concret sigui el problema més fàcil serà que algú et pugui ajudar.

Informació adicional
Afegeix informació adicional que consideris rellevant. Captures de pantalla. Missatges d'error. Etc.

Eliminar l'opció expulsió per simplificar la gestió d'incidències (genera confusió)

Atenció! No incloure dades sensibles en aquest formulari.

Informa quin tipus d'ajuda necessites:

  • Necessito ajuda técnica per tal de modificar o posar en marxa el programa.
  • Necessito ajuda funcional per entendre alguna pantalla.

Explica que tens fet fins ara:
Explica que tens desenvolupat i en quin punt estàs encallat. Quant més concret sigui el problema més fàcil serà que algú et pugui ajudar.

Informació adicional
Afegeix informació adicional que consideris rellevant. Captures de pantalla. Missatges d'error. Etc.

Esfera. Els noms dels nivells estan hardcoded.

Descriu el problema

Els noms dels nivells a importar estan hardcoded. Pot ser que algun centre tingui noms de nivell diferents. Ex 'BAT' en comptes de 'BTX':

    alumnesDeESO = Q(grup__curs__nivell__nom_nivell__exact='ESO')
    alumnesDeBTX = Q(grup__curs__nivell__nom_nivell__exact='BTX')

Passes per reproduir-ho

Es pot veure a https://github.com/ctrl-alt-d/django-aula/pull/23/files#diff-18818d283fd07bafe32bf3304b267f93R216

Comportament esperat

De la issue esfera #15 :

... el primer pas del procés d'importació serà mirar quins Nivells estem important i fer inserts i actualitzacions com sempre, però només baixes dels nivells que importem ( això tant a ext_saga com a ext_esfera )

Quan diu "quins Nivells estem important" vol dir que els Nivells s'han de mirar del fitxer que importem. És a dir:

nivells = {  g.grup_esfera.curs.nivell Grup2Aula.objects.all() }
...
AlumnesDeEsfera = Alumne.objects.filter(grup__curs__nivell__in = nivells)

Generar expulsió des de Tutoria

Hola, com a tutora se'm genera un avís per generar una expulsió a una alumne per acumulació d'incidències. en aquest moment vaig a la pestanya "incidències del tutor" on, en vermell surt "generar expulsió"; en clicar aquí no hauria de sortir l'expulsió(la finestra que hem d'omplir)? perquè m'envia a la finestra "full d'incidències per alumne"...

gràcies

===============

1.- En clicar hauria d'haver generat l'expulsió.
2.- Quan t'envia a la pàgina 'full d'incidències per alumne' hauries de trobar allà l'expulsió pendent de ser gestioinada.

Entenc que està fallan el pas 1 i per això no li troves sentit.

Bad Request (400) quan s'imprimeix informe Impersonalitzat

Atenció! No incloure dades sensibles en aquest formulari.

Descriu el problema
Quan fas una impersonació com un tutor, si accedeixes al menú de Impressió de faltes i incidències, al imprimir un informe, ens retorna un error web Bad Request (400). També es genera un report d'error

Passes per reproduir-ho
Passes per reproduir aquest error:
1.Anar a 'Impersonació'
2. Impersonar-se com un tutor.
3. Anar a 'Tutoria'
4. Seleccionar 'Impressió de faltes i incidències'
5. Omplir les dades ('No imprimir recordatoris', 'Data des de' , 'Data fins a', 'Incloure XXX1A', 'Imprimir informe')
6. Apareix l'error: Bad Request (400)

*Comportament esperat
Si es fa des de l'usuari retorna l'informe esperat.

Captures de pantalla

Informació adicional
The number of GET/POST parameters exceeded settings.DATA_UPLOAD_MAX_NUMBER_FIELDS.

Report at /tutoria/tutoriaInformeFaltesIncidencies/
The number of GET/POST parameters exceeded settings.DATA_UPLOAD_MAX_NUMBER_FIELDS.

Request Method: POST
Request URL: https://my.web/tutoria/tutoriaInformeFaltesIncidencies/
Django Version: 1.11.16
Python Executable: /usr/bin/python
Python Version: 2.7.15
(...)
Request information:
USER: super
GET: No GET data
POST: No POST data
FILES: No FILES data
(...)

Error

Traces

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.