1 line
No EOL
42 KiB
JSON
1 line
No EOL
42 KiB
JSON
{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Projekt RepApp RepApp ist eine Web App um Reparaturen im Rahmen eines Repair-Caf\u00e9s zu organisieren. Benutzer RepApp unterscheidet zwischen den folgenden Benutzer-Typen: Gast Ein Gast ist ein Ger\u00e4tebesitzer der ein oder mehrere Ger\u00e4te zur Reparatur anmelden m\u00f6chte. Reparateur Ein Reparateur ist ein Mitglied des Repair-Caf\u00e9s das die G\u00e4ste bei der Reparatur ihrer Ger\u00e4te unterst\u00fctzt. Organisator Ein Organisator ist Mitglied des Repair-Caf\u00e9s das die Termine mit den G\u00e4sten organisiert und die Reparateure zu den Ger\u00e4ten zuordnet. Anmelde Konzept RepApp unterst\u00fctzt pro Benutzer-Gruppe verschiedenen Anmelde-Konzepte. G\u00e4ste F\u00fcr G\u00e4ste gibt es Einmal-Logins. Ein Einmal-Login ist ein Geheimnis und eine Ziel-URL, das dem Gast in From eines Anmelde-Links in einer eMail mitgeteilt wird. Mit diesem Link kann der Gast sich einmalig anmelden, da das Geheimnis danach potentiell Dritten bekannt ist, z.B. \u00fcber die Browser History. Nach dem erfolgreichen Login wird der Gast automatisch zu der hinterlegten URL weitergeleitet. Dieser Mechanismus erlaubt es einem Gast \"per Klick\" Zugriff auf gesch\u00fctzte Daten zu geben. Wenn ein Gast versucht den Einmal-Link nochmals zu verwenden, schl\u00e4gt dies Fehl, und dem Gast wird automatisch ein neuer Einmal-Link per eMail mitgeteilt. Dies wird dem Gast auch \u00fcber entsprechende Nachrichten mitgeteilt. Mitarbeiter Der Login f\u00fcr Mitarbeiter ist nur \u00fcber das Single-Sign-On der Repair-Caf\u00e9s erlaubt (Keycloak), das mittels OIDC angebunden ist. Alle Mitarbeiter im Repair-Caf\u00e9 haben dort bereits einen Benutzer, was zum einen sicherstellt dass es sich um einen Mitarbeiter handelt, und zum anderen auch die Veraltung der Benutzer in RepApp vereinfacht.","title":"Beschreibung"},{"location":"#projekt-repapp","text":"RepApp ist eine Web App um Reparaturen im Rahmen eines Repair-Caf\u00e9s zu organisieren.","title":"Projekt RepApp"},{"location":"#benutzer","text":"RepApp unterscheidet zwischen den folgenden Benutzer-Typen:","title":"Benutzer"},{"location":"#gast","text":"Ein Gast ist ein Ger\u00e4tebesitzer der ein oder mehrere Ger\u00e4te zur Reparatur anmelden m\u00f6chte.","title":"Gast"},{"location":"#reparateur","text":"Ein Reparateur ist ein Mitglied des Repair-Caf\u00e9s das die G\u00e4ste bei der Reparatur ihrer Ger\u00e4te unterst\u00fctzt.","title":"Reparateur"},{"location":"#organisator","text":"Ein Organisator ist Mitglied des Repair-Caf\u00e9s das die Termine mit den G\u00e4sten organisiert und die Reparateure zu den Ger\u00e4ten zuordnet.","title":"Organisator"},{"location":"#anmelde-konzept","text":"RepApp unterst\u00fctzt pro Benutzer-Gruppe verschiedenen Anmelde-Konzepte.","title":"Anmelde Konzept"},{"location":"#gaste","text":"F\u00fcr G\u00e4ste gibt es Einmal-Logins. Ein Einmal-Login ist ein Geheimnis und eine Ziel-URL, das dem Gast in From eines Anmelde-Links in einer eMail mitgeteilt wird. Mit diesem Link kann der Gast sich einmalig anmelden, da das Geheimnis danach potentiell Dritten bekannt ist, z.B. \u00fcber die Browser History. Nach dem erfolgreichen Login wird der Gast automatisch zu der hinterlegten URL weitergeleitet. Dieser Mechanismus erlaubt es einem Gast \"per Klick\" Zugriff auf gesch\u00fctzte Daten zu geben. Wenn ein Gast versucht den Einmal-Link nochmals zu verwenden, schl\u00e4gt dies Fehl, und dem Gast wird automatisch ein neuer Einmal-Link per eMail mitgeteilt. Dies wird dem Gast auch \u00fcber entsprechende Nachrichten mitgeteilt.","title":"G\u00e4ste"},{"location":"#mitarbeiter","text":"Der Login f\u00fcr Mitarbeiter ist nur \u00fcber das Single-Sign-On der Repair-Caf\u00e9s erlaubt (Keycloak), das mittels OIDC angebunden ist. Alle Mitarbeiter im Repair-Caf\u00e9 haben dort bereits einen Benutzer, was zum einen sicherstellt dass es sich um einen Mitarbeiter handelt, und zum anderen auch die Veraltung der Benutzer in RepApp vereinfacht.","title":"Mitarbeiter"},{"location":"dev/","text":"Repapp - developer documentation The Repapp is a repair assignment booking and management tool. It tries to support all common workflows happening while organizing a repair caf\u00e9 event. It's build using the Django web framework. The code of the Repapp is hosted on Github: https://github.com/makes-hacks-hip/RepApp Local development setup Clone the Github repository Create a Python environment: python -m venv venv Activate the Python environment: source venv/bin/activate Install the dependencies: pip install -r requirements_prod.txt and pip install -r requirements_dev.txt Change to the Django project folder: cd repapp Setup the database: python manage.py makemigrations python manage.py migrate Setup an admin user: python manage.py createsuperuser Run the local test server: python manage.py runserver Docker image Build the image: docker build -t repapp . Run the image: docker run --rm -d \\ -p 127.0.0.1:8020:8020 \\ --name repapp \\ --env DJANGO_SUPERUSER_USERNAME=suba \\ --env DJANGO_SUPERUSER_PASSWORD=ThePassword \\ --env DJANGO_SUPERUSER_EMAIL=noreply@example.com \\ repapp` Open http://127.0.0.1:8020/ in your browser Tests Unit tests: python manage.py test LiveServer tests: python manage.py test repapp.live_tests Coverage coverage run --source='.' manage.py test coverage report or coverage html","title":"Overview"},{"location":"dev/#repapp-developer-documentation","text":"The Repapp is a repair assignment booking and management tool. It tries to support all common workflows happening while organizing a repair caf\u00e9 event. It's build using the Django web framework. The code of the Repapp is hosted on Github: https://github.com/makes-hacks-hip/RepApp","title":"Repapp - developer documentation"},{"location":"dev/#local-development-setup","text":"Clone the Github repository Create a Python environment: python -m venv venv Activate the Python environment: source venv/bin/activate Install the dependencies: pip install -r requirements_prod.txt and pip install -r requirements_dev.txt Change to the Django project folder: cd repapp Setup the database: python manage.py makemigrations python manage.py migrate Setup an admin user: python manage.py createsuperuser Run the local test server: python manage.py runserver","title":"Local development setup"},{"location":"dev/#docker-image","text":"Build the image: docker build -t repapp . Run the image: docker run --rm -d \\ -p 127.0.0.1:8020:8020 \\ --name repapp \\ --env DJANGO_SUPERUSER_USERNAME=suba \\ --env DJANGO_SUPERUSER_PASSWORD=ThePassword \\ --env DJANGO_SUPERUSER_EMAIL=noreply@example.com \\ repapp` Open http://127.0.0.1:8020/ in your browser","title":"Docker image"},{"location":"dev/#tests","text":"Unit tests: python manage.py test LiveServer tests: python manage.py test repapp.live_tests","title":"Tests"},{"location":"dev/#coverage","text":"coverage run --source='.' manage.py test coverage report or coverage html","title":"Coverage"},{"location":"dev/apps/","text":"Apps The repapp is split into different modules, realized as Django apps, to improve the maintainability. One time login The one time login module provides a login for guests using a one time secret as part of an URL. The templates use the settings.ORGANIZATION variable to fill the organization name. The Django mail module is used to send emails. See https://docs.djangoproject.com/en/4.2/topics/email/ for details how to configure the mail host. Configuration To enable the one time login links, an additional authentication backend must get added: # Repapp specific authentication backends AUTHENTICATION_BACKENDS = [ # Backend for one time logins \"one_time_login.authentication_backends.OneTimeLoginBackend\", ] The one time login urls must get added using namespace one_time_login : urlpatterns = i18n_patterns( ... path(_('one_time_login/'), include('one_time_login.urls', namespace='one_time_login')), ... ) Email interface The email interface modules supports handling of mails. It support sending of mails, including HTML formatting and attachments, and it supports receiving of plain text and HTML formatted mails, including attachments. The Django mail module is used to send emails. See https://docs.djangoproject.com/en/4.2/topics/email/ for details how to configure the mail host. CKEditor is used for email content editing. See https://django-ckeditor.readthedocs.io/en/latest/ for details. Crispy forms is used for form rendering. See https://django-crispy-forms.readthedocs.io/en/latest/ for details. Bootstrap 5 theme for crispy forms is used. See https://github.com/django-crispy-forms/crispy-bootstrap5 for details. Configuration The email interface urls must get added using namespace email_interface : urlpatterns = i18n_patterns( ... path(_('emails/'), include('email_interface.urls', namespace='email_interface')), ... ) To use CKEditor as authenticated user, the following additional urls must get added: urlpatterns = i18n_patterns( ... # CKEditor upload views path('upload/', login_required(ckeditor_views.upload), name=\"ckeditor_upload\"), path('browse/', never_cache(login_required(ckeditor_views.browse)), name=\"ckeditor_browse\"), ... ) To be abel to use CKEditor also the static an media content must get served. For development this is done with: if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)","title":"Apps"},{"location":"dev/apps/#apps","text":"The repapp is split into different modules, realized as Django apps, to improve the maintainability.","title":"Apps"},{"location":"dev/apps/#one-time-login","text":"The one time login module provides a login for guests using a one time secret as part of an URL. The templates use the settings.ORGANIZATION variable to fill the organization name. The Django mail module is used to send emails. See https://docs.djangoproject.com/en/4.2/topics/email/ for details how to configure the mail host.","title":"One time login"},{"location":"dev/apps/#configuration","text":"To enable the one time login links, an additional authentication backend must get added: # Repapp specific authentication backends AUTHENTICATION_BACKENDS = [ # Backend for one time logins \"one_time_login.authentication_backends.OneTimeLoginBackend\", ] The one time login urls must get added using namespace one_time_login : urlpatterns = i18n_patterns( ... path(_('one_time_login/'), include('one_time_login.urls', namespace='one_time_login')), ... )","title":"Configuration"},{"location":"dev/apps/#email-interface","text":"The email interface modules supports handling of mails. It support sending of mails, including HTML formatting and attachments, and it supports receiving of plain text and HTML formatted mails, including attachments. The Django mail module is used to send emails. See https://docs.djangoproject.com/en/4.2/topics/email/ for details how to configure the mail host. CKEditor is used for email content editing. See https://django-ckeditor.readthedocs.io/en/latest/ for details. Crispy forms is used for form rendering. See https://django-crispy-forms.readthedocs.io/en/latest/ for details. Bootstrap 5 theme for crispy forms is used. See https://github.com/django-crispy-forms/crispy-bootstrap5 for details.","title":"Email interface"},{"location":"dev/apps/#configuration_1","text":"The email interface urls must get added using namespace email_interface : urlpatterns = i18n_patterns( ... path(_('emails/'), include('email_interface.urls', namespace='email_interface')), ... ) To use CKEditor as authenticated user, the following additional urls must get added: urlpatterns = i18n_patterns( ... # CKEditor upload views path('upload/', login_required(ckeditor_views.upload), name=\"ckeditor_upload\"), path('browse/', never_cache(login_required(ckeditor_views.browse)), name=\"ckeditor_browse\"), ... ) To be abel to use CKEditor also the static an media content must get served. For development this is done with: if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)","title":"Configuration"},{"location":"dev/configuration/","text":"Repapp configuration Debug mode The Django debug mode is activated if there is a environment variable DJANGO_DEBUG with the value \"true\", \"1\" or \"t\". By default, the debug mode is disabled. Organization name Some templates use and organization name. This value is taken from settings.ORGANIZATION and defaults to \"Repair-Caf\u00e9 Hilpoltstein\". Email settings The following environment variables are used to configure the Django email feature: EMAIL_HOST = os.getenv(\"DJANGO_EMAIL_HOST\", \"\") EMAIL_PORT = (int)(os.getenv(\"DJANGO_EMAIL_PORT\", \"25\")) EMAIL_HOST_USER = os.getenv(\"DJANGO_EMAIL_HOST_USER\", None) EMAIL_HOST_PASSWORD = os.getenv(\"DJANGO_EMAIL_HOST_PASSWORD\", None) EMAIL_USE_TLS = os.getenv(\"DJANGO_EMAIL_USE_TLS\", \"true\") in (\"true\", \"1\", \"t\") DEFAULT_FROM_EMAIL = os.getenv(\"DJANGO_SENDER_ADDRESS\", \"\") See https://docs.djangoproject.com/en/4.2/topics/email/ for more details. Translations Repapp is using localization, and comes with german and english translations. Enable the LocaleMiddleware : MIDDLEWARE = [ ... 'django.contrib.sessions.middleware.SessionMiddleware', # enable translation 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', ... ] We use the following localization settings: LANGUAGE_CODE = 'de' TIME_ZONE = 'Europe/Berlin' USE_I18N = True USE_L10N = True USE_TZ = True LANGUAGES = [ ('de', _('German')), ('en', _('English')), ] LOCALE_PATHS = [ BASE_DIR / 'locale', ] Also the URLs are localized, and the language is choosen using i18n URL patterns: ... from django.conf.urls.i18n import i18n_patterns from django.utils.translation import gettext_lazy as _ urlpatterns = i18n_patterns( path('admin/', admin.site.urls), path(_('one_time_login/'), include('one_time_login.urls', namespace='one_time_login')), # URLs for rosetta translation interface path('rosetta/', include('rosetta.urls')), ) Rosetta For translating the interface, we use rosetta. For more details see https://pypi.org/project/django-rosetta/. You need to install rosetta ( pip install django-rosetta ) and enable it in the apps: INSTALLED_APPS = [ ... # enable rosetta online translation interface 'rosetta', ... ] Rosatta is made availabel at rosetta/ . One time login To enable the one time login links, an additional authentication backend must get added: # Repapp specific authentication backends AUTHENTICATION_BACKENDS = [ # Backend for one time logins \"one_time_login.authentication_backends.OneTimeLoginBackend\", ] Email interface The email interface uses CKEditor, crispy forms and easy thumbnails. The apps are enabled with: INSTALLED_APPS = [ ... # CKEditor for mail content editing \"ckeditor\", \"ckeditor_uploader\", # Crispy forms for bootstrap 5 form design \"crispy_forms\", \"crispy_bootstrap5\", # for creating thumbnails, used by email_interface demo views 'easy_thumbnails', ... ] For CKEditor, we use the following settings: # editor upload path, used e.g. for send mail demo CKEDITOR_UPLOAD_PATH = \"editor_uploads/\" CKEDITOR_IMAGE_BACKEND = 'pillow' # CKEditor default config CKEDITOR_CONFIGS = { 'default': { 'toolbar': 'full', 'height': 300, 'width': '100%', }, } To enable the image upload of CKEditor, also the Django media paths and urls must get configured: # Django media and static file config, required for CKEditor STATIC_URL = \"static/\" MEDIA_URL = \"media/\" # Use subfolders of project folder STATIC_ROOT = os.path.join(BASE_DIR, \"static\") MEDIA_ROOT = os.path.join(BASE_DIR, \"media\") For crispy forms, we use the bootstrap 5 theme: # Crispy forms settings CRISPY_ALLOWED_TEMPLATE_PACKS = \"bootstrap5\" CRISPY_TEMPLATE_PACK = \"bootstrap5\" The static files for bootstrap must also be made available.","title":"Repapp configuration"},{"location":"dev/configuration/#repapp-configuration","text":"","title":"Repapp configuration"},{"location":"dev/configuration/#debug-mode","text":"The Django debug mode is activated if there is a environment variable DJANGO_DEBUG with the value \"true\", \"1\" or \"t\". By default, the debug mode is disabled.","title":"Debug mode"},{"location":"dev/configuration/#organization-name","text":"Some templates use and organization name. This value is taken from settings.ORGANIZATION and defaults to \"Repair-Caf\u00e9 Hilpoltstein\".","title":"Organization name"},{"location":"dev/configuration/#email-settings","text":"The following environment variables are used to configure the Django email feature: EMAIL_HOST = os.getenv(\"DJANGO_EMAIL_HOST\", \"\") EMAIL_PORT = (int)(os.getenv(\"DJANGO_EMAIL_PORT\", \"25\")) EMAIL_HOST_USER = os.getenv(\"DJANGO_EMAIL_HOST_USER\", None) EMAIL_HOST_PASSWORD = os.getenv(\"DJANGO_EMAIL_HOST_PASSWORD\", None) EMAIL_USE_TLS = os.getenv(\"DJANGO_EMAIL_USE_TLS\", \"true\") in (\"true\", \"1\", \"t\") DEFAULT_FROM_EMAIL = os.getenv(\"DJANGO_SENDER_ADDRESS\", \"\") See https://docs.djangoproject.com/en/4.2/topics/email/ for more details.","title":"Email settings"},{"location":"dev/configuration/#translations","text":"Repapp is using localization, and comes with german and english translations. Enable the LocaleMiddleware : MIDDLEWARE = [ ... 'django.contrib.sessions.middleware.SessionMiddleware', # enable translation 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', ... ] We use the following localization settings: LANGUAGE_CODE = 'de' TIME_ZONE = 'Europe/Berlin' USE_I18N = True USE_L10N = True USE_TZ = True LANGUAGES = [ ('de', _('German')), ('en', _('English')), ] LOCALE_PATHS = [ BASE_DIR / 'locale', ] Also the URLs are localized, and the language is choosen using i18n URL patterns: ... from django.conf.urls.i18n import i18n_patterns from django.utils.translation import gettext_lazy as _ urlpatterns = i18n_patterns( path('admin/', admin.site.urls), path(_('one_time_login/'), include('one_time_login.urls', namespace='one_time_login')), # URLs for rosetta translation interface path('rosetta/', include('rosetta.urls')), )","title":"Translations"},{"location":"dev/configuration/#rosetta","text":"For translating the interface, we use rosetta. For more details see https://pypi.org/project/django-rosetta/. You need to install rosetta ( pip install django-rosetta ) and enable it in the apps: INSTALLED_APPS = [ ... # enable rosetta online translation interface 'rosetta', ... ] Rosatta is made availabel at rosetta/ .","title":"Rosetta"},{"location":"dev/configuration/#one-time-login","text":"To enable the one time login links, an additional authentication backend must get added: # Repapp specific authentication backends AUTHENTICATION_BACKENDS = [ # Backend for one time logins \"one_time_login.authentication_backends.OneTimeLoginBackend\", ]","title":"One time login"},{"location":"dev/configuration/#email-interface","text":"The email interface uses CKEditor, crispy forms and easy thumbnails. The apps are enabled with: INSTALLED_APPS = [ ... # CKEditor for mail content editing \"ckeditor\", \"ckeditor_uploader\", # Crispy forms for bootstrap 5 form design \"crispy_forms\", \"crispy_bootstrap5\", # for creating thumbnails, used by email_interface demo views 'easy_thumbnails', ... ] For CKEditor, we use the following settings: # editor upload path, used e.g. for send mail demo CKEDITOR_UPLOAD_PATH = \"editor_uploads/\" CKEDITOR_IMAGE_BACKEND = 'pillow' # CKEditor default config CKEDITOR_CONFIGS = { 'default': { 'toolbar': 'full', 'height': 300, 'width': '100%', }, } To enable the image upload of CKEditor, also the Django media paths and urls must get configured: # Django media and static file config, required for CKEditor STATIC_URL = \"static/\" MEDIA_URL = \"media/\" # Use subfolders of project folder STATIC_ROOT = os.path.join(BASE_DIR, \"static\") MEDIA_ROOT = os.path.join(BASE_DIR, \"media\") For crispy forms, we use the bootstrap 5 theme: # Crispy forms settings CRISPY_ALLOWED_TEMPLATE_PACKS = \"bootstrap5\" CRISPY_TEMPLATE_PACK = \"bootstrap5\" The static files for bootstrap must also be made available.","title":"Email interface"},{"location":"dev/objects/","text":"Objects A device is an object owned by a guest which has some issue. To get support for fixing the issue, a guest provides the information about the device and requests a repair appointment during a repair_cafe . A repair_cafe happens at a specific date and location. It's an event which consists of appointments of repairers with guests to fix a device . To organize a repair_cafe , a organizer needs to know which repairer will attend a repair_cafe , to schedule repair appointments . In case of ambiguities, a organizer or a repairer can raise a consultation request. This consultation request is sent to the guest to get the needed information. In addition, a organizer or a repairer can add an comment to a device . Repair_Cafe A repair_cafe is a event happening at a specific date at a specific location. During a repair_cafe appointments of guests with repairers happens to fix broken devices . Fields location : Char (200) -- location of the event address : Char (200) -- address where the event happens event_date : Date -- date when the event happens repairer : many to many -- will attend the event Device Appointment Guest Repairer Organizer Consultation Comment","title":"Objects"},{"location":"dev/objects/#objects","text":"A device is an object owned by a guest which has some issue. To get support for fixing the issue, a guest provides the information about the device and requests a repair appointment during a repair_cafe . A repair_cafe happens at a specific date and location. It's an event which consists of appointments of repairers with guests to fix a device . To organize a repair_cafe , a organizer needs to know which repairer will attend a repair_cafe , to schedule repair appointments . In case of ambiguities, a organizer or a repairer can raise a consultation request. This consultation request is sent to the guest to get the needed information. In addition, a organizer or a repairer can add an comment to a device .","title":"Objects"},{"location":"dev/objects/#repair_cafe","text":"A repair_cafe is a event happening at a specific date at a specific location. During a repair_cafe appointments of guests with repairers happens to fix broken devices .","title":"Repair_Cafe"},{"location":"dev/objects/#fields","text":"location : Char (200) -- location of the event address : Char (200) -- address where the event happens event_date : Date -- date when the event happens repairer : many to many -- will attend the event","title":"Fields"},{"location":"dev/objects/#device","text":"","title":"Device"},{"location":"dev/objects/#appointment","text":"","title":"Appointment"},{"location":"dev/objects/#guest","text":"","title":"Guest"},{"location":"dev/objects/#repairer","text":"","title":"Repairer"},{"location":"dev/objects/#organizer","text":"","title":"Organizer"},{"location":"dev/objects/#consultation","text":"","title":"Consultation"},{"location":"dev/objects/#comment","text":"","title":"Comment"},{"location":"dev/stories/","text":"Stories User stories describing real world repair-cafe situations and workflows. Repairer cancels on short notice One of the repairers cancels his attendance to a repair-cafe on short notice. If possible, assign existing repair appointments to other repairers, and align new time schedule with the guests using phone calls. If not possible, cancel repair assignments using phone calls. Guest cancels a repair appointment on short notice A guest cancels a repair appointment on short notice. This frees a timeslot for an additional repair appointment. If there are fitting devices on the waiting list, the owner is called and a repair appointment is offered. If no fitting devices are available, the last appointment of the day is re-scheduled to the free slot, in alignment with the guest. Guest misses a repair appointment or causes trouble The guest is added to a blacklist. The last repair appointment of a repair-cafe must get canceled Because of delays or other issues, the last repair appointment of a repair-cafe event cannot happen anymore. If possible, the last repair appointment is cancelled using a phone call with the guest. All slots for a repair-cafe are very early assigned Deactivate registration form and give a hint on the homepage that the event is already fully booked. All slots for some device types are already very relay assigned Further registration is still possible, but a hint is added that repair assignments for devices types XYZ are not possible anymore. Creation and handling of waiting lists If a repair appointment is not possible for a device, because of high demand for this device type of cancellation of a repairer, the guest is contacted and asked to register the device again for a later repair-cafe, or if the device shall be registered for a later repair-cafe. Guest registers again: It's possible that again no slots are free, and the repair appointment is canceled again. The information that the guest had the device already registered for a repair-cafe is lost. Organizer registers device: Increased organization effort and there is a high probability that the guest doesn't keep the repair appointment. All canceled devices are moved to the \"canceled devices\" section of the forum manually. These devices are considered during the planning of the next repair-cafe, and the forum entry is moved to the section of the next event. The guest doesn't confirm the appointment and doesn't reply to mails Try to call guest by phone. If the organizers cannot reach the guest, the repair-appointment is canceled by mail. If possible, another guest form the waiting list is contacted. Some device types are not repaired during a repair-cafe Some device types are not repaired during a repair-cafe. These devices are assigned to repairers for \"offline\" repair. Align with repairer: If the repairer accepts the device, the contact data of repairer are given to the guest. For TV: Type plate and issue description is given to a repairer, and options are evaluated. If a repair is possible, the guest shall bring the TV to the Haus Einstein. When the repair is done, the guest get's an update by mail. strategic overbooking If all slots are booked, further devices are accepted on best effort. These devices are brought by the guests at the beginning of a repair-cafe and get collected at the end of a repair-cafe. When a repairer has some time between two repair-assignments, he can pick such a device.Having such devices is wanted by the repairers. This is only used for guests living very close to the event, and if the repair effort should be very limited. Communication with guests Communication shall primary happen by e-mail. If further information is needed for a device, a mail is written to the guest. This communication often involves embedded images and attachments. A FAQ on the website of the repair-cafe, which can get referenced, may help for this communication. Where is the device? It can happen that it's not clear where a device is located, for example if a device stays with the repair-cafe team for a follow up repair, or if a device is accepted outside of an repair-cafe event. Current workflow: For devices which get brought by the owner and collected later: If there was no time to repair the device, or if spare parts were missing, we may offer the guest to keep the device till the next repair-cafe event happens. Such devices are kept in Haus Einstein. Another such case may be that a guest brings a device a few days before the repair-cafe event, because of personal availability. Such devices are also stored in Haus Einstein. It may also happen that a repairer agrees with a guest to keep the device and continue with the repair activity outside of an repair-cafe event. Especially for such cases, the current location of a device may be not defined and a documentation is missing. Criteria for repair-assignments Will a skilled repairer be available? Point of time of registration (waiting lists and registration date) Is the device and failure a candidate for an overbooking device? Is there a feedback of a repairer that he wants to take a look at the device? Is all needed information available? Paperwork during the event Based on an Excel sheet, repair slips (guest data and signature) and routing slips (device data and fields for notes) are created. Both slips have the same date and id, so it's possible to match them if needed. This is required in case of issues or complaints of the guest.","title":"Stories"},{"location":"dev/stories/#stories","text":"User stories describing real world repair-cafe situations and workflows.","title":"Stories"},{"location":"dev/stories/#repairer-cancels-on-short-notice","text":"One of the repairers cancels his attendance to a repair-cafe on short notice. If possible, assign existing repair appointments to other repairers, and align new time schedule with the guests using phone calls. If not possible, cancel repair assignments using phone calls.","title":"Repairer cancels on short notice"},{"location":"dev/stories/#guest-cancels-a-repair-appointment-on-short-notice","text":"A guest cancels a repair appointment on short notice. This frees a timeslot for an additional repair appointment. If there are fitting devices on the waiting list, the owner is called and a repair appointment is offered. If no fitting devices are available, the last appointment of the day is re-scheduled to the free slot, in alignment with the guest.","title":"Guest cancels a repair appointment on short notice"},{"location":"dev/stories/#guest-misses-a-repair-appointment-or-causes-trouble","text":"The guest is added to a blacklist.","title":"Guest misses a repair appointment or causes trouble"},{"location":"dev/stories/#the-last-repair-appointment-of-a-repair-cafe-must-get-canceled","text":"Because of delays or other issues, the last repair appointment of a repair-cafe event cannot happen anymore. If possible, the last repair appointment is cancelled using a phone call with the guest.","title":"The last repair appointment of a repair-cafe must get canceled"},{"location":"dev/stories/#all-slots-for-a-repair-cafe-are-very-early-assigned","text":"Deactivate registration form and give a hint on the homepage that the event is already fully booked.","title":"All slots for a repair-cafe are very early assigned"},{"location":"dev/stories/#all-slots-for-some-device-types-are-already-very-relay-assigned","text":"Further registration is still possible, but a hint is added that repair assignments for devices types XYZ are not possible anymore.","title":"All slots for some device types are already very relay assigned"},{"location":"dev/stories/#creation-and-handling-of-waiting-lists","text":"If a repair appointment is not possible for a device, because of high demand for this device type of cancellation of a repairer, the guest is contacted and asked to register the device again for a later repair-cafe, or if the device shall be registered for a later repair-cafe. Guest registers again: It's possible that again no slots are free, and the repair appointment is canceled again. The information that the guest had the device already registered for a repair-cafe is lost. Organizer registers device: Increased organization effort and there is a high probability that the guest doesn't keep the repair appointment. All canceled devices are moved to the \"canceled devices\" section of the forum manually. These devices are considered during the planning of the next repair-cafe, and the forum entry is moved to the section of the next event.","title":"Creation and handling of waiting lists"},{"location":"dev/stories/#the-guest-doesnt-confirm-the-appointment-and-doesnt-reply-to-mails","text":"Try to call guest by phone. If the organizers cannot reach the guest, the repair-appointment is canceled by mail. If possible, another guest form the waiting list is contacted.","title":"The guest doesn't confirm the appointment and doesn't reply to mails"},{"location":"dev/stories/#some-device-types-are-not-repaired-during-a-repair-cafe","text":"Some device types are not repaired during a repair-cafe. These devices are assigned to repairers for \"offline\" repair. Align with repairer: If the repairer accepts the device, the contact data of repairer are given to the guest. For TV: Type plate and issue description is given to a repairer, and options are evaluated. If a repair is possible, the guest shall bring the TV to the Haus Einstein. When the repair is done, the guest get's an update by mail.","title":"Some device types are not repaired during a repair-cafe"},{"location":"dev/stories/#strategic-overbooking","text":"If all slots are booked, further devices are accepted on best effort. These devices are brought by the guests at the beginning of a repair-cafe and get collected at the end of a repair-cafe. When a repairer has some time between two repair-assignments, he can pick such a device.Having such devices is wanted by the repairers. This is only used for guests living very close to the event, and if the repair effort should be very limited.","title":"strategic overbooking"},{"location":"dev/stories/#communication-with-guests","text":"Communication shall primary happen by e-mail. If further information is needed for a device, a mail is written to the guest. This communication often involves embedded images and attachments. A FAQ on the website of the repair-cafe, which can get referenced, may help for this communication.","title":"Communication with guests"},{"location":"dev/stories/#where-is-the-device","text":"It can happen that it's not clear where a device is located, for example if a device stays with the repair-cafe team for a follow up repair, or if a device is accepted outside of an repair-cafe event. Current workflow: For devices which get brought by the owner and collected later: If there was no time to repair the device, or if spare parts were missing, we may offer the guest to keep the device till the next repair-cafe event happens. Such devices are kept in Haus Einstein. Another such case may be that a guest brings a device a few days before the repair-cafe event, because of personal availability. Such devices are also stored in Haus Einstein. It may also happen that a repairer agrees with a guest to keep the device and continue with the repair activity outside of an repair-cafe event. Especially for such cases, the current location of a device may be not defined and a documentation is missing.","title":"Where is the device?"},{"location":"dev/stories/#criteria-for-repair-assignments","text":"Will a skilled repairer be available? Point of time of registration (waiting lists and registration date) Is the device and failure a candidate for an overbooking device? Is there a feedback of a repairer that he wants to take a look at the device? Is all needed information available?","title":"Criteria for repair-assignments"},{"location":"dev/stories/#paperwork-during-the-event","text":"Based on an Excel sheet, repair slips (guest data and signature) and routing slips (device data and fields for notes) are created. Both slips have the same date and id, so it's possible to match them if needed. This is required in case of issues or complaints of the guest.","title":"Paperwork during the event"},{"location":"dev/use_cases/","text":"Use cases The repapp shall support the following use cases: Guest [ ] As a guest, I want to register a device for a repair-cafe event. [ ] As a guest, I want to get a confirmation for my device registration. [ ] As a guest, I want to get notified about a repair-assignment or a rejection of my device. [ ] As a guest, I want to get notified about information request for my device. [ ] As a guest, I want to be able to answer information requests for my device. [ ] As a guest, I want to be able to contact the repair-cafe organizers. [ ] As a guest, I want to be able to do all interaction by mail only (except the device registration). [ ] As a guest, I want to confirm a repair-assignment by mail. [ ] As a guest, I want to be able to see my device data and the status of my device registration. [ ] As a guest, I want to be able to register my device for a follow up repair. [ ] As a guest, I want to be able to view my personal data. [ ] As a guest, I want to be able to view my device data. [ ] As a guest, I want to be able to edit my personal data. [ ] As a guest, I want to be able to edit my device data. [ ] As a guest, I want to be able to delete my personal data. [ ] As a guest, I want to be able to delete my device data. [ ] As a guest, I want to be able to cancel my device registration. Repairer [ ] As a repairer, I want to be able to view the registered devices. [ ] As a repairer, I want to show interest for a device. [ ] As a repairer, I want to request additional information for a device. [ ] As a repairer, I want to enable or disable notifications. [ ] As a repairer, I want to get notified when an information request gets answered. [ ] As a repairer, I want to get notified when a device gets assigned to me. [ ] As a repairer, I want to confirm the participation at a repair-cafe. [ ] As a repairer, I want to decline the participation at a repair-cafe. [ ] As a repairer, I want to reject a device. [ ] As a repairer, I want to get notified if a device assigned to me gets canceled. Organizer [ ] As a organizer, I want to get notified when a new device is registered. [ ] As a organizer, I want to schedule new repair-cafe events. [ ] As a organizer, I want to view device details. [ ] As a organizer, I want to request further information for a device. [ ] As a organizer, I want to reject a device. [ ] As a organizer, I want to accept a device. [ ] As a organizer, I want to create a repair-assignment. [ ] As a organizer, I want to confirm the participation of a repairer for a repair-cafe event. [ ] As a organizer, I want to decline the participation of a repairer for a repair-cafe event. [ ] As a organizer, I want to edit the device data. [ ] As a organizer, I want to edit the guest data. [ ] As a organizer, I want to unregister a device. [ ] As a organizer, I want to get notified if a guest deletes a device registration. [ ] As a organizer, I want to get export all data for a repair-cafe. [ ] As a organizer, I want to assign devices to repair-cafes.","title":"Use cases"},{"location":"dev/use_cases/#use-cases","text":"The repapp shall support the following use cases:","title":"Use cases"},{"location":"dev/use_cases/#guest","text":"[ ] As a guest, I want to register a device for a repair-cafe event. [ ] As a guest, I want to get a confirmation for my device registration. [ ] As a guest, I want to get notified about a repair-assignment or a rejection of my device. [ ] As a guest, I want to get notified about information request for my device. [ ] As a guest, I want to be able to answer information requests for my device. [ ] As a guest, I want to be able to contact the repair-cafe organizers. [ ] As a guest, I want to be able to do all interaction by mail only (except the device registration). [ ] As a guest, I want to confirm a repair-assignment by mail. [ ] As a guest, I want to be able to see my device data and the status of my device registration. [ ] As a guest, I want to be able to register my device for a follow up repair. [ ] As a guest, I want to be able to view my personal data. [ ] As a guest, I want to be able to view my device data. [ ] As a guest, I want to be able to edit my personal data. [ ] As a guest, I want to be able to edit my device data. [ ] As a guest, I want to be able to delete my personal data. [ ] As a guest, I want to be able to delete my device data. [ ] As a guest, I want to be able to cancel my device registration.","title":"Guest"},{"location":"dev/use_cases/#repairer","text":"[ ] As a repairer, I want to be able to view the registered devices. [ ] As a repairer, I want to show interest for a device. [ ] As a repairer, I want to request additional information for a device. [ ] As a repairer, I want to enable or disable notifications. [ ] As a repairer, I want to get notified when an information request gets answered. [ ] As a repairer, I want to get notified when a device gets assigned to me. [ ] As a repairer, I want to confirm the participation at a repair-cafe. [ ] As a repairer, I want to decline the participation at a repair-cafe. [ ] As a repairer, I want to reject a device. [ ] As a repairer, I want to get notified if a device assigned to me gets canceled.","title":"Repairer"},{"location":"dev/use_cases/#organizer","text":"[ ] As a organizer, I want to get notified when a new device is registered. [ ] As a organizer, I want to schedule new repair-cafe events. [ ] As a organizer, I want to view device details. [ ] As a organizer, I want to request further information for a device. [ ] As a organizer, I want to reject a device. [ ] As a organizer, I want to accept a device. [ ] As a organizer, I want to create a repair-assignment. [ ] As a organizer, I want to confirm the participation of a repairer for a repair-cafe event. [ ] As a organizer, I want to decline the participation of a repairer for a repair-cafe event. [ ] As a organizer, I want to edit the device data. [ ] As a organizer, I want to edit the guest data. [ ] As a organizer, I want to unregister a device. [ ] As a organizer, I want to get notified if a guest deletes a device registration. [ ] As a organizer, I want to get export all data for a repair-cafe. [ ] As a organizer, I want to assign devices to repair-cafes.","title":"Organizer"},{"location":"dev/users/","text":"Users Repapp distinguishes two user categories. A guest is a owner of an device. The guest is booking a repair appointment to get support from a repair caf\u00e9 member to fix his device. A member can be an organizer or a repairer . A organizer is taking care of arranging the repair assignments, and needs to access the private contact data of a guest to do this job. A repairer is supporting the guest in fixing his device. The repairer only needs the details of the device in advance, but not the private contact data of the guest.","title":"Users"},{"location":"dev/users/#users","text":"Repapp distinguishes two user categories. A guest is a owner of an device. The guest is booking a repair appointment to get support from a repair caf\u00e9 member to fix his device. A member can be an organizer or a repairer . A organizer is taking care of arranging the repair assignments, and needs to access the private contact data of a guest to do this job. A repairer is supporting the guest in fixing his device. The repairer only needs the details of the device in advance, but not the private contact data of the guest.","title":"Users"}]} |