ctrl-alt-d / django-aula Goto Github PK
View Code? Open in Web Editor NEWGestió de presencia, incidències i més en centres educatius i acadèmies.
License: Other
Gestió de presencia, incidències i més en centres educatius i acadèmies.
License: Other
Hi ha 3 o 4 proefessor que han intentar adjudicar alumnes a les seves assignatures i dona un error:
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 = '
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.
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:
*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ó
def tutorsDelGrupDeLAlumne(self):
return Professor.objects.filter(tutor__grup=self.grup).distinct()
incidencia.professional = alumne.tutorsDelGrupDeLAlumne().first()
Volia saber on és el paràmetre que diu quantes faltes es necessita per a generar una incidència.
Volem canviar el que ve per defecte (3) a 4.
Gràcies
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
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.
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.
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?
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:
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.
Amb DJAU disfruta de les 4 llibertats:
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.
Atenció! No incloure dades sensibles en aquest formulari.
Informa quin tipus d'ajuda necessites:
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ó?
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._**
Algú m'ha dit que algú li ha dit que s'ha duplicat una expulsió.
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.
Com esborrar tots els controls d'assistència d'un alumne i assignatura durant un periode de temps?
python manage.py shell
i executar-lousername_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.
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:
https://help.github.com/articles/fork-a-repo/
CUSTOM_ORDER_PRESENCIA = ['alumne']
https://github.com/ctrl-alt-d/django-aula/blob/master/aula/settings.py#L3
for control_a in ( impartir.controlassistencia_set
.order_by(**settings.CUSTOM_ORDER_PRESENCIA)):
CUSTOM_ORDER_PRESENCIA = ['alumne__cognoms','alumne__nom',]
https://help.github.com/articles/creating-a-pull-request-from-a-fork/
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.
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
Segurament siguin les mateixes instruccions, però posant la darrera versió LTS li donaria un toc un xic més actual.
Gràcies
PD: D'altra banda, ja sé que potser és massa, però unes instruccions per Fedora (o algú de la família rpm: CentOS, Suse,...) no estaria malament tampoc
;* [x] Necessito ajuda tècnica per tal de modificar o posar en marxa el programa.
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.
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:
Valor afegit:
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:
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)
Si s'intenta generar un report (per exemple el corresponent a la impresió dels fulls de pagament d'una sortida)
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¿¿??
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 |
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::
( Nota: relacionat amb missatgeria #28 )
Es poden exportar dades des de la base de dades o des de la shell de django.
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.
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 ajuda per alguna exportació concreta? Pots obrir una issue.
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.
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.
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:
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.
Proposta
Reportat que una incidència s'ha 'quintuplicat' en enviar-la per mòbil.
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"
Descriu el problema
Model actuació no té verbose name ( etiquetes ) , falten accents.
Passes per reproduir-ho
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
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
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.
*Comportament esperat
Hauria d'haver aparegut tot l'horari del professor.
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).
És a dir: oferir un servei SaaS de pagament basat en aquest software. El punt que sigui lliure és important. Gràcies.
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'
Cal fer el nou mòdul ext_esfera.
Hi ha diversos canvis a tenir en compte:
XlsxWriter
que ens ho soluciona)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 )Seria ideal disposar d'un XLSX amb dades FAKE però amb tots els casos contemplats.
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 |
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" )
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:
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:
La proposta seria que dins el nou menú MISSATGERIA els TUTORS hi tinguessin la pestanyes:
La proposta seria que dins el nou menú MISSATGERIA les FAMÍLIES hi tinguessin la pestanyes:
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 )
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
Informació adicional
S'hauria d'eliminar els espais finals en els noms dels grups, en els móduls d'importació.
Si es fa una reserva d'aula a través de l'assistent de la tria d'aula, es pot reservar un aula :
Si es fa la reserva a través de l'assistent de la tria de franja horària, l'aula reservable no apareix:
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
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.
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
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.
S'han detectat problemes a la funció justificadorMKTable no ompla les dades correctament.
Aquesta funció l'hem de reescriure amb aquests criteris:
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
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 ) )
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
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)
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 ?
Atenció! No incloure dades sensibles en aquest formulari.
Informa quin tipus d'ajuda necessites:
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.
Atenció! No incloure dades sensibles en aquest formulari.
Informa quin tipus d'ajuda necessites:
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.
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)
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.
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
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.