1
0
Fork 0
mirror of https://github.com/voltbonn/diversity.volt.link.git synced 2024-05-12 16:01:32 +00:00

feat: start of the project

This commit is contained in:
thomasrosen 2022-11-19 23:27:43 +01:00
commit 80d5b3fcfa
11 changed files with 1744 additions and 0 deletions

2
.gitattributes vendored Normal file
View file

@ -0,0 +1,2 @@
# Auto detect text files and perform LF normalization
* text=auto

33
.github/workflows/deploy.yml vendored Normal file
View file

@ -0,0 +1,33 @@
# This is a basic workflow to help you get started with Actions
name: Deploy
# Controls when the action will run.
on:
# Triggers the workflow on push or pull request events but only for the main branch
push:
branches: [ main ]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
build:
name: Deploy
# The type of runner that the job will run on
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v3
- name: run deploy commands on uberspace
uses: garygrossgarten/github-action-ssh@release
with:
command: |
cd ~/diversity.volt.link/ && git pull && yarn && supervisorctl restart diversity_volt_link;
host: maury.uberspace.de
username: volteu
password: ${{ secrets.UBERSPACE_PASSWORD_VOLTEU }}

106
.gitignore vendored Normal file
View file

@ -0,0 +1,106 @@
yarn.lock
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# TypeScript v1 declaration files
typings/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
# parcel-bundler cache (https://parceljs.org/)
.cache
# Next.js build output
.next
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and *not* Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port

1
README.md Normal file
View file

@ -0,0 +1 @@
# diversity.volt.link

580
index.js Normal file
View file

@ -0,0 +1,580 @@
require('dotenv').config()
const isDevEnvironment = process.env.environment === 'dev' || false
const path = require('path')
const url = require('url')
const http = require('http')
const express = require('express')
const rateLimit = require('express-rate-limit')
const { fetch } = require('cross-fetch')
const { sendInitialStats } = require('./stats.js')
const fs = require('fs')
const ObjectId = require('mongodb').ObjectId // just to check ObjectIDs
const static_files_path = path.join(__dirname,
isDevEnvironment
? '../volt.link-frontend/build/'
: '../volt.link-frontend/'
)
function checkOrigin(origin){
return (
typeof origin === 'string'
&& (
origin === 'volt.link'
|| origin.endsWith('://volt.link')
// allow from subdomains
|| origin.endsWith('.volt.link')
// allow for localhost
|| origin.endsWith('localhost:3000')
|| origin.endsWith('localhost:4000')
|| origin.endsWith('0.0.0.0:3000')
|| origin.endsWith('0.0.0.0:4000')
|| origin.endsWith('localhost:19006')
)
)
}
// function getUserLocales(){
// const localesByCounty = {
// de: ['de'],
// }
// // https://get.geojs.io/v1/ip/geo/{ip address}.json
// }
const app = express()
// set up rate limiter: maximum of 100 requests per minute
app.use(rateLimit({
windowMs: 1 * 60 * 1000, // 1 minute
max: 1000, // Limit each IP to 1000 requests per `window` (here, per 1 minute)
standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers
legacyHeaders: false, // Disable the `X-RateLimit-*` headers
})) // apply rate limiter to all requests
app.use(express.json())
app.use(function (req, res, next) {
// const origin = req.get('origin')
const origin = req.header('Origin')
if (checkOrigin(origin)) {
req.is_subdomain = true
req.origin = origin
res.setHeader('Access-Control-Allow-Origin', origin)
res.setHeader('Access-Control-Allow-Credentials', true)
} else {
req.is_subdomain = false
}
next()
})
app.options("/*", function (req, res, next) {
// correctly response for cors
if (req.is_subdomain) {
res.setHeader('Access-Control-Allow-Origin', req.origin)
res.setHeader('Access-Control-Allow-Credentials', true)
res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS')
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With')
res.sendStatus(200)
} else {
res.sendStatus(403)
}
})
app.get('/login', (req, res) => {
res.redirect(url.format({
pathname: '/auth/google',
query: req.query,
}))
})
const blockQuery = `
_id
type
properties
content {
blockId
block {
_id
type
properties
content {
blockId
}
parent
metadata {
modified
modified_by
}
permissions
computed {
roles
inherited_block_permissions
contentAsPlaintext
}
}
}
parent
metadata {
modified
modified_by
}
permissions
computed {
roles
inherited_block_permissions
contentAsPlaintext
}
`
async function getBlockBySlug(slug, headers = {}) {
return new Promise(resolve => {
fetch((
isDevEnvironment
? 'http://0.0.0.0:4004/graphql/v1/'
: 'https://api.volt.link/graphql/v1/'
), {
method: 'POST',
body: JSON.stringify({
query: `query ($slug: String!) {
block: blockBySlug (slug: $slug) {
${blockQuery}
}
}`,
variables: {
slug,
}
}),
headers: {
...headers,
'content-type': 'application/json',
}
})
.then(async data => {
data = await data.json()
if (
data
&& data.data
&& data.data.block
) {
resolve(data.data.block)
} else {
resolve(null)
}
})
.catch(error => {
console.error(error)
resolve(null)
})
})
}
async function getBlockById(id, headers = {}) {
return new Promise(resolve => {
fetch((
isDevEnvironment
? 'http://0.0.0.0:4004/graphql/v1/'
: 'https://api.volt.link/graphql/v1/'
), {
method: 'POST',
body: JSON.stringify({
query: `query ($_id: ObjectID!) {
block (_id: $_id) {
${blockQuery}
}
}`,
variables: {
_id: id,
}
}),
headers: {
...headers,
'content-type': 'application/json',
}
})
.then(async data => {
data = await data.json()
if (
data
&& data.data
&& data.data.block
) {
resolve(data.data.block)
} else {
resolve(null)
}
})
.catch(error => {
console.error(error)
resolve(null)
})
})
}
async function getBlocks(ids = [], slugs = [], headers = {}) {
return new Promise(resolve => {
ids = ids.filter(id => ObjectId.isValid(id))
fetch((
isDevEnvironment
? 'http://0.0.0.0:4004/graphql/v1/'
: 'https://api.volt.link/graphql/v1/'
), {
method: 'POST',
body: JSON.stringify({
query: `query ($ids: [ObjectID], $slugs: [String]) {
blocks (ids: $ids, slugs: $slugs) {
${blockQuery}
}
}`,
variables: {
ids,
slugs,
}
}),
headers: {
...headers,
'content-type': 'application/json',
}
})
.then(async data => {
data = await data.json()
if (
data
&& data.data
&& data.data.blocks
) {
resolve(data.data.blocks)
} else {
resolve(null)
}
})
.catch(error => {
console.error(error)
resolve(null)
})
})
}
async function getSlugInfos(slug, headers = {}) {
return new Promise(resolve => {
fetch((
isDevEnvironment
? 'http://0.0.0.0:4004/graphql/v1/'
: 'https://api.volt.link/graphql/v1/'
), {
method: 'POST',
body: JSON.stringify({
query: `query checkSlug ($slug: String!) {
checkSlug (slug: $slug) {
existsAsSlug
existsAsId
}
}`,
variables: {
slug: slug,
}
}),
headers: {
...headers,
'content-type': 'application/json',
}
})
.then(async data => {
data = await data.json()
if (
data
&& data.data
&& data.data.checkSlug
) {
resolve({
existsAsSlug: data.data.checkSlug.existsAsSlug || false,
existsAsId: data.data.checkSlug.existsAsId || false,
})
} else {
resolve({
existsAsSlug: false,
existsAsId: false,
})
}
})
.catch(error => {
console.error('error for checkSlug:', error)
resolve({
existsAsSlug: false,
existsAsId: false,
})
})
})
}
async function getBlockBySlugOrId(slugOrId, headers = {}) {
let block = await getBlockBySlug(slugOrId, headers)
if (block) {
return {
block,
used_query: 'slug',
}
} else {
block = await getBlockById(slugOrId, headers)
return {
block,
used_query: 'id',
}
}
}
function getImageUrl(imageObj) {
if (
typeof imageObj === 'object'
&& imageObj !== null
&& !Array.isArray(imageObj)
) {
if (imageObj.type === 'url') {
return imageObj.url || ''
}
}
return ''
}
function showClient(res, blocks = []) {
// send index file to show client
const index_file_path = static_files_path + '/index.html'
// load index file
fs.readFile(index_file_path, 'utf8', function (err, index_file) {
if (err) {
console.error(err)
res.sendStatus(500)
} else {
let title = 'VoltLink'
let description = 'VoltLink is an information-hub about Volt Europa.'
let coverphoto_url = ''
if (blocks.length > 0) {
const block = blocks[0]
if (
block
&& block.hasOwnProperty('properties')
&& typeof block.properties === 'object'
&& block.properties !== null
) {
if (
block.properties.hasOwnProperty('text')
&& typeof block.properties.text === 'string'
&& block.properties.text.length > 0
) {
title = block.properties.text
description = ''
}
coverphoto_url = getImageUrl(block.properties.coverphoto)
if (!coverphoto_url) {
coverphoto_url = getImageUrl(block.properties.icon)
}
}
if (coverphoto_url !== '') {
coverphoto_url = `https://api.volt.link/download_url?f=jpg&w=1000&h=1000&url=${encodeURIComponent(coverphoto_url)}`
}
}
const __SERVER_DATA__ = "JSON.parse(" + JSON.stringify(JSON.stringify({ preloaded_blocks: blocks })) + ")" // First stringify is to get arrays and objects represented correctly. Second stringify+parse to ease parsing of js code on the client.
index_file = index_file
.replace(/__META_TITLE__/g, title)
.replace(/__META_DESCRIPTION__/g, description)
.replace(/__META_COVERPHOTO__/g, coverphoto_url)
.replace(/__SERVER_DATA__/g, __SERVER_DATA__)
res.send(index_file)
}
})
// The client needs to check if the block exists OR if a error page should be shown.
// AND the client should to correct the slug if it's wrong.
// (TODO: There currently is no function to find the correct slug from an id.)
}
function normalizeSlug(slug) {
if (typeof slug === 'string') {
slug = slug
.trim()
.toLowerCase()
// .replace(/_/g, '-')
return slug
}
return null
}
let static_files_cache = null
async function getIsStaticFile(slug) {
if (static_files_cache === null) {
const filenames = fs.readdirSync(static_files_path, { withFileTypes: true })
.map(({ name: filename }) => normalizeSlug(filename))
const filetypes = fs.readdirSync(static_files_path, { withFileTypes: true })
.reduce((filetypes, fileinfos) => {
filetypes[fileinfos.name] = {
isFile: fileinfos.isFile(),
}
return filetypes
}, {})
static_files_cache = {
filenames,
filetypes,
}
}
if (static_files_cache !== null) {
slug = normalizeSlug(slug)
const isStaticFile = static_files_cache.filenames.includes(slug)
let isFile = false
if (static_files_cache.filetypes.hasOwnProperty(slug)) {
isFile = static_files_cache.filetypes[slug].isFile
}
return {
isStaticFile,
isFile,
}
}
return {
isStaticFile: false,
isFile: false,
}
}
app.get('/', async function (req, res, next) {
showClient(res) // call showClient to replace the default meta infos (__META_TITLE__, ...)
})
app.get(/^\/([^=/]*)(?:=?)([^=/]*)(.*)/, async function (req, res, next) {
const headers = {
cookie: req.headers.cookie, // for authentication
'user-agent': req.headers['user-agent'], // for analytics
referer: req.headers.referer, // for analytics
}
const group0 = req.params[0] // slug (or id if group1 is empty) // capture-group before separator
const group1 = req.params[1] // id // capture-group after separator
// const group2 = req.params[2] // suffix
const {
isStaticFile,
isFile,
} = await getIsStaticFile(group0)
if (isStaticFile === true) {
// captureGroupBeforeSeparator is a file. Not a slug or id.
if (isFile === true) {
res.sendFile(static_files_path + group0)
} else {
// Go to the next route.
// The next route shows static files.
next('route')
}
} else {
let done = false
if (done === false && !!group0 && !group1) {
const blocks = await getBlocks([group0], [group0], headers)
if (!!blocks && blocks.length > 0) {
// This gets called for "/:slug"
// group0 is a slug
// redirect it accoringly
const block = blocks[0]
if (block.type === 'redirect') {
let redirect_url = block.properties.url || ''
if (typeof redirect_url === 'string' && redirect_url !== '') {
done = true
// log redirect
try {
const website = isDevEnvironment
? process.env.umami_id_dev
: process.env.umami_id_prod
const hostname = isDevEnvironment
? 'localhost'
: 'volt.link'
const url = req.originalUrl
sendInitialStats({ website, url, hostname }, req.headers)
} catch (error) {
console.error('umami-error:', error)
}
// redirect
res.redirect(redirect_url)
}
}
if (done === false) {
done = true
showClient(res, blocks)
}
}
}
if (done === false && !!group1) {
// This gets called for "/:slug=:id"
// check if group1 is ID by finding it in the database
const block = await getBlockById(group1, headers)
if (!!block && !!block._id) {
if (done === false) {
done = true
showClient(res, [block])
}
}
}
if (
done === false
&& typeof group0 === 'string' && group0 !== ''
) {
// Error 403 and 404. These are checked in more detail on the client.
done = true
showClient(res)
}
if (done === false) {
next('route')
}
}
})
app.use(express.static(static_files_path))
app.get('*', function (req, res, next) {
showClient(res) // show index.html as a fallback
})
const port = 4007
const host = '0.0.0.0' // Uberspace wants 0.0.0.0
http.createServer(app).listen({ port, host }, () =>
console.info(`
🚀 Server ready
For uberspace: http://${host}:${port}/
For local development: http://localhost:${port}/
`)
)

13
package.json Normal file
View file

@ -0,0 +1,13 @@
{
"dependencies": {
"@fluent/langneg": "^0.6.2",
"cross-fetch": "^3.1.4",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"express-rate-limit": "^6.4.0",
"mongodb": "^4.9.1"
},
"scripts": {
"start": "node index.js"
}
}

279
readme/Disabilities.md Normal file
View file

@ -0,0 +1,279 @@
# Disabilities
The data is from this website (2020.02.01): https://unstats.un.org/unsd/demographic-social/sconcerns/disability/statistics/#/activities
## Added of the list down below this part
4 Communication
16 Hearing
16 Seeing
5 Self-care
2 Remembering and concentrating
1 Remembering, concentrating or making decisions
1 Remembering and concentrating and making decisions
4 Remembering
2 Concentrating
1 Cognition (remembering, concentration, communication, etc.)
1 Memory
9 Walking and climbing stairs
1 Walking or climbing stairs
3 Walking and moving
3 Mobility
2 Dressing and undressing
1 Dressing and bathing
1 Mental
1 Mental condition
2 Dexterity
1 Learning and understanding
4 Learning
1 Learning and intellectual problems
1 Learning and development of tasks
1 Flexibility
1 Pain
1 Developmental condition
1 Asthma or allergy
1 Anxiety or worries
1 Interpersonal interactions and relationships
1 Usual activities or tasks
1 Independent living
1 Home life
1 Dyslexia or dyscalculia
1 Neuropsychiatric
2 Speaking
1 Lifting and carrying objects
## Reordered List
16 Hearing
16 Seeing
4 Communication
2 Speaking
4 Remembering
2 Concentrating
2 Remembering and concentrating
1 Remembering, concentrating or making decisions
1 Remembering and concentrating and making decisions
4 Learning
1 Learning and understanding
1 Learning and intellectual problems
1 Learning and development of tasks
1 Memory
1 Cognition (remembering, concentration, communication, etc.)
1 Dyslexia or dyscalculia
9 Walking and climbing stairs
1 Walking or climbing stairs
3 Walking and moving
3 Mobility
2 Dressing and undressing
1 Dressing and bathing
1 Lifting and carrying objects
1 Mental
1 Mental condition
1 Neuropsychiatric
1 Developmental condition
1 Anxiety or worries
1 Interpersonal interactions and relationships
2 Dexterity
1 Flexibility
1 Pain
1 Asthma or allergy
5 Self-care
1 Home life
1 Independent living
1 Usual activities or tasks
## Afghanistan
1. Communication;
2. Hearing;
3. Seeing;
4. Self-care;
5. Remembering and concentrating;
6. Walking and climbing stairs.
## Albania
1. Seeing;
2. Hearing;
3. Walking or climbing stairs;
4. Remembering, concentrating or making decisions;
5. Self-care: Daily self-care (wearing, eating, washing, etc.);
6. Communicating (to understand others or vice-versa give and take information).
## Argentina
1. Seeing: seeing, even with glasses;
2. Hearing: hearing, even when wearing a hearing aid;
3. Walking and climbing stairs: walking or climbing steps;
4. Dexterity: grabbing objects and / or openning containers with ow hands; or
5. Learning and understanding: understanding and / or learning.
## Canada
* Seeing: difficulties seeing with glasses or contact lenses;
* Hearing: difficulties hearing with a hearing aid or cochlear implant;
* Walking and climbing stairs: walking on flat surfaces and using stairs;
* Flexibility: difficulties bending down and picking up an object from the floor; reaching in any direction);
* Dexterity: difficulties using own fingers to grasp small objects like a pencil or scissors;
* Pain: difficulties due to pain;
* Learning: difficulties due to learning disabilities such as dyslexia, hyperactivity, attention problems, etc.;
* Developmental condition: Developmental disability or disorder;
* Mental condition: difficulties dur to emotional, psychological or mental health condition;
* Memory: difficulties due to memory problems or periods of confusion.
## Finland
* Seeing,
* Hearing,
* Walking and moving,
* Dressing and undressing (55+),
* Remembering,
* Concentrating (14-16),
* Learning (14-16).
30+:
* Seeing: To read an ordinary newspaper print (with or without glasses);
* Hearing: To hear what is said in a conversation between several people (with or without a hearing aid);
* Walking and moving: To walk about half a kilometre without resting (+ To run a short distance (about 100 metres) + To climb one flight of stairs without resting);
* Dressing and undressing (55+): Dressing and undressing;
* Remembering: memory working.
14-16:
* Seeing: difficulty Seeing (if you wear eyeglasses or contact lenses, evaluate your vision while wearing them);
* Hearing: difficulty Hearing (if you use a hearing aid, evaluate your hearing with your hearing aid on);
* Walking and moving: difficulty Walking a distance of about 500 m, e.g. once around a sports field (if you use an assistive device, evaluate your mobility while using that device);
* Remembering: difficulty Remembering things;
* Learning: difficulty Learning new things;
* Concentrating: difficulty Concentrating on something that you enjoy doing.
## Montenegro
1. Seeing: Seeing, despite using glasses;
2. Hearing: Hearing, despite using hearing aids;
3. Walking and climbing stairs: Disability/difficulty with moving (walking, climbing steps, etc.);
4. Cognition: Cognition (remembering, concentration, communication, etc.);
5. Other: Other difficulties.
## Netherlands
* Seeing,
* Hearing,
* Mobility.
## Norway
1. Seeing;
2. Hearing;
3. Walking and climbing stairs;
4. Self-care.
{moderate and severe limitations}
## Korea
1. Visual impairment;
2. Hearing impairment;
3. Speech impediment;
4. Dementia;
5. Stroke;
6. Physical constraints including those on walking, stair-climbing, and holding and transporting;
7. Intellectual autistic disability;
8. Mental constraints including mental disease.
## Sweden
* Seeing: impaired vision;
* Hearing: impaired hearing;
* Walking and climbing stairs: reduced mobility;
* Asthma or allergy: severe problems of asthma and / or allergy;
* Anxiety or worries: severe problems of anxiety or worry;
* Usual activities or tasks: strongly limited due to limitation in activities because of health problems;
* Dyslexia or dyscalculia: severe problems due to dyslexia and/or dyscalculia;
* Neuropsychiatric: neuropsychiatric diagnosis.
## United Kingdom of Great Britain and Northern Ireland
* Seeing,
* Hearing,
* Speaking,
* Mobility,
* Learning,
* Remembering.
For those aged 16+ the APS was used for the categories
* Seeing (Difficulty in seeing),
* Hearing (Difficulty in hearing),
* Speaking (Speech impediment),
* Mobility (Arms,hands/Legs or feet/Back or neck),
* Learning (Learning difficulties).
FRS used for Remembering all ages. Children's prevalence of
* Seeing,
* Hearing,
* Mobility and
* Learning
derived from FRS.
## United States of America
* Seeing: blind or having serious difficulty seeing even when wearing glasses;
* Hearing: deaf or having serious difficulty hearing;
* Walking and climbing stairs (ages 5+): serious difficulty walking or climbing stairs;
* Dressing and bathing (ages 5+): difficulty dressing or bathing;
* Remembering and concentrating and making decisions (ages 5+): serious difficulty concentrating, remembering, or making decisions;
* Independent living (ages 15+): difficulty doing errands alone such as visiting a doctor's office or shopping.
## Turkey
* Seeing (data collected for population 0+) = difficulty in seeing (even if you use glasses or contact lenses);
* Hearing (0+) = difficulty in hearing (even if you use hearing aid);
* Speaking (3+) = difficulty in speaking such as speech impairment, lalopathy, stammering, etc.;
* Walking and climbing stairs (3+) = difficulty in walking or climbing stairs;
* Lifting and carrying objects (3+) = difficulty in holding or lifting something;
* Learning and intellectual problems (3+) = difficulty in learning, doing simple calculations, remembering and concentrating when compared to their peers.
## Spain
Types of disabilities for population 6 years and over:
1. Seeing: Sight;
2. Hearing: Hear;
3. Communication: Communicate;
4. Learning and development of tasks: Learn, apply knowledge and develop tasks (only mental functions);
5. Mobility: Get around + Use arms and hands + Get around outside the home;
6. Self-care: Care for oneself;
7. Home life: Perform housework (population 10 years and over);
8. Interpersonal interactions and relationships: Relate to other persons.
## Portugal
1. Seeing = difficulty seeing, even if wearing glasses or contact lenses;
2. Hearing = difficulty hearing, even if using a hearing aid;
3. Walking and climbing stairs = difficulty walking or climbing stairs;
4. Remembering and concentrating = difficulty remembering or concentrating;
5. Self-care = difficulty having a bath or getting dressed on one's own;
6. Communication = difficulty understanding others or being understood by others.

187
readme/Ideas.md Normal file
View file

@ -0,0 +1,187 @@
# Volt Bonn — Interne Diversity Umfrage
## TODO:
* Daten einzeln an den Server senden.
* Themen zu Fragen umformulieren.
## Warum fragen wir? / Themen für Fragen
1. Volt will niederschwellig sein: Es soll möglichst leicht sein, bei Volt mitzumachen. Daher möchten wir wissen, welche Besonderheiten und Bedürfnisse es in dieser Hinsicht gibt.
=> Relevant sind alle Punkte, die für Volt-Aktivitäten und die Kommunikation miteinander eine Rolle spielen.
* Körperliche Beinträchtigungen (In eckigen Klammern sind benötigte Hilfmittel notiert)
- ✅ Sehschwächen
* ✅ Blind [Gehstock,Fragen/Zuhören]
* ✅ Weit- und Kurzsichtigkeit [Brille, Lupe] -> Kann der Beamer gesehen werden?, Muss die Schrift größer geschrieben werden?
* ✅ Farbprobleme [Farbe+Form]
- Hörschwächen
* Taub [Gebärdensprache,Schrift]
* Teil-Hörschwäche [Hörgerät]
* nur angestrengtes Hören in volle Räume wie Bars oder Kantinen [Microphone, nur eine\*r redet gleichzeitig]
- Gehbehinderungen
* keine/taube Beine [Rollstuhl (Mit dem Rollstuhl kann man nicht so einfach in den ersten Stock.)]
* schweres Aufstehen [Geduld der Anderen, Außenplatz an einem Tisch]
- Sprechschwächen
* Stumm [Gebärdensprache,Schrift]
* Stottern [Geduld der Zuhörer\*innen]
- ✅ Allergien (Zu Laktose und Gluten gibt es auch starke Meinungen. Ist also auch politisch interessant.) [Bei Events sollten diese Personen etwas essen/trinken können]
* Fisch
* ✅ Laktose
* ✅ Gluten
- ✅ Kopf
* ✅ Introvertiert [Personen ansprechen oder andere zügeln]
* ✅ Mentale Krankheiten (Depression, Bipolar, Borderline, Höhenangst, ...) [Geduld der Anderen, wenn die affektive Störung Probleme bereitet]
* ✅ Bildungsniveau
- ✅ [Manche Themen/Worte/Abkürzungen müssen erklärt werden.]
- ✅ Sprachen [Manche Wort/Sprachen müssen übersetzt werden.]
- ✅ PC-Kenntisse
* Transportmögichkeiten (Auto,Fahrrad,ÖPNV,...)
- Das nächste Event ist zu weit weg. [Event zB in Dörfern anbieten]
* Technische Möglichkeiten (Hat ein Handy, Laptop, Internetzugang, ...)
2. Volt will die Gesellschaft möglichst breit abbilden: Wir erarbeiten politische Positionen, die viele verschiedene Gruppen und Personen betreffen. Wenn Betroffene dabei mitreden, können wir dies besonders gut und authentisch tun. Daher möchten wir aktiv Gruppen stärken, die bislang in Volt unterrepräsentiert sind. Dazu müssen wir aber wissen, welche Besonderheiten es aktuell in Volt gibt.
=> Relevant sind die Besonderheiten, die für bestimmte Politische Themen eine Rolle spielen (insbes., da die Personen besonders betroffen sind).
* ✅ Ess- und Trinkgewohnheiten [Bei Events sollten diese Personen etwas essen/trinken können]
- ✅ Vegan
- ✅ Vegetarisch
- ✅ Kein Alkohol
- ✅ Ich trinke/vertrage kein Sprudelwasser.
- Ich versuche Firmen wie Nestle oder Haribo wegen ihrer Firmenpolitik zu vermeiden.
* Queerness
- ✅ Sexualität (Lesbisch, Schwul, Bi-Sexuell, Pan-, Poly-, A-, ...)
- ✅ Gender (Trans\*, Non-Binary, Gender-Fluid, ...)
- Biologisches Geschlecht (Inter\*, Weiblich, Männlich)
- Geschlechtsausdruck (Gender-Expression) Wie man sein Gender und Geschlecht auslebt. Ob man den Rollen-Clichés entspricht.
* ✅ Diskriminierungs Erfahrungen
- ✅ Hautfarbe/Hauttyp
- ✅ Herkunft (Die eigene oder die der Eltern/Vorfahren)
- ✅ Queerness (Sexualität,Gender,Geschlecht)
* Lebenssituationen
- Finanzielle Möglichkeiten (jeden Monat am Kontolimit ->BIS-ZU-> dreißig Yachten und eine Mansion)
- ✅ Benötigte finannizelle Hilfmittel (Hartz4, Bafög, ...)
- Art der Unterkunft (Eigenheim, Miet-Wohnung, WG, Obdachlos, ...)
- Anzahl an Kindern
- Anzahl an (Ehe-)Partner (0=single,1,2,...)
* Kultureller Hintergrund / Unterschiede verschiedener Kulturen
- Welche Kulturangebote nutzt du? (Kino, Theater, Ausstellungen, Festival, ...)
- Religion
- Interessensgebiete
- Wie viele Sprachen kannst du Sprechen? / In wie vielen Sprachen kannst du dich verständigen?
- Lebst du in einem anderen Land als du geboren bist? (Kultureller Austausch)
3. Wenn wir wissen, wie divers wir sind, können wir damit auch aktiv werben: Wir sind für Dich offen!
=> Relevant sind die Besonderheiten, die den Leuten selbst wichtig sind, aber in Volt unterrepräsentiert sind.
* Alles in 1 und 2 genannten Themen.
* Das was die Beantwortenden und zusätzlich am Ende mitteilen.
* Kultureller Hintergrund
* Religion
* ...
## Angelehnt an die oberen Punkte könnte der Fragebogen in diese drei Abschnitte unterteil werden:
**Aktivitäten und Kommunikation**
**Repräsentation in Volt**
**Freitext**
- Welche Merkmale fehlen Deiner Meinung nach hier, sind aber für Diversität wichtig (und sollten noch abgefragt werden)?
- Welche Merkmale sollten wir künftig nicht mehr abfragen?
- Sonstige Anmerkungen?
# Bildung
* Mein höchster Bildungsabschluss ist: ...
* Ich kann mich auf Englisch verständigen. (Als internationale Organisation wird viel auf Englisch kommuniziert. Hiermit können wir schauen, ob mehr in die einzelnen Sprachen übersetzt werden sollte.)
* Ich habe gelegentlich/oft Probleme mich am Computer oder Handy zurecht zu finden.
* _Können wir Wissen abfragen, indem wir Stichwörter nennen und fragen ob die Person diese theoretisch erleutern kann?_
# Ess- und Trinkgewohnheiten
Welchen Aussagen kannst du zustimmen?
* Ich lebe vegetarisch.
* Ich lebe vegan.
* Ich möchte/soll keinen Alkohol trinken.
* Ich trinke/vertrage keinen Sprudel in meinen Getränken. (Interessant zu wissen, wenn wir Getränke für ein Event einkaufen.)
* Ich bin Laktose intolerant.
* Ich vertrage keine Gluten.
* Ich habe Allergien durch die ich nicht jedes Essen vertrage. (Laktose, Gluten)
# Kopf
* Ich bin eher [introvertiert...extrovertiert].
* Ich habe eine mentale Krankheit. (Depression, Bipolar, Borderline, ADHS, Höhenangst, ...)
# Körperliche Beinträchtigungen
* Ich bin kurzsichtig.
* Ich bin weitsichtig.
* Ich bin Blind.
* Ich habe eine Farbenfehlsichtigkeit. (Rot-Grün-Sehschwäche, ...)
* Ich kann keine Farben sehen. (Farbenblindheit)
* Ich bin Schwerhörig.
* Ich bin Gehörlos.
# Lebenssituationen
* Ich bekomme finannizelle Hilfe. (Bafög, Hartz4, ...)
* In welcher Art Unterkunft (Eigenheim, Miet-Wohnung, WG, Obdachlos, ...)
## Possible topics:
### Körper
* Alter
* Geschlecht im Ausweis/Pass
* Mein Gender: weiblich, männlich, Non-Binary, ...
* Ich stehe auf: [Frauen] ... [Beides/jedes Gender/es wechselt] ... [Männer]
* Hauttyp
* Benötigte Hilfmittel (Rollstuhl, Hörgerät, ...)
* Mentale Krankheiten (Bipolar, ...)
* Essgewohnheiten (Vegan/Vegetarisch/...)
* Ich bin eher: [extrovertiert]...[depends/...]...[introvertiert]
### Verschiedenes (Geographie, Kultur, Religion, ...)
* Wohnorte (Postleitzahl)
* Staatsangehörigkeiten
* Geboren-in (Staat)
* In wie vielen Länder warst du insgesamt?
* Wie viele Länder liegen davon außerhalb der EU?
* Zu welchen Kulturkreisen zählst du dich? Deutsch, Rheinland, Philippinisch, Türkisch
* Zu welchen Religionen zählst du dich? Christentum, Judentum, Islam, ...
* Sprachen (Gebärden, Deutsch, ...)
### Beruf, Finanzen, Geld, Liquidität
* Art der beruflichen Tätigkeiten (Angestellte*r, Student*in, ...)
* Privat Krankenversichert?
* Empfängst du Hartz4/Bafög/...?
* Hast du ein geregeltes Einkommen?
* Wie viel Geld besitzt du ungefähr insgesamt? (Auf die simpelst-darstellbare Potenz gerundet: <1k/<10k/<20k/.../<500k/<1mio/>=1mio€)
### Müssen die folgenden Themen noch rein?
* Intersex
* Transgender
* Interessen/Hobbies
* Physische Krankheiten
* Allergien

233
readme/Notes.md Normal file
View file

@ -0,0 +1,233 @@
# Education Level
Matura = A-Levels = Reifezeugnis/Abitur = European Baccalaureate (= secondary school-leaving certificates)
https://en.wikipedia.org/wiki/Matura
https://en.wikipedia.org/wiki/List_of_secondary_school_leaving_qualifications
http://www.admission.ucla.edu/prospect/adm_in/othcntry.htm
Mittlere Reife/Realschulabschluss = General Certificate of Secondary Education (UK)
Hauptschulabschluss/Berufsreife/Berufsbildungsreife
https://de.wikipedia.org/wiki/International_Standard_Classification_of_Education
ISCED-0 = Early childhood Education
ISCED-1 = Primary education
ISCED-2 = Lower secondary education
ISCED-3 = Upper secondary education
ISCED-4 = Post-secondary non-tertiary education
ISCED-5 = Short-cycle tertiary education
ISCED-6 = Bachelor or equivalent
ISCED-7 = Master or equivalent
ISCED-8 = Doctoral or equivalent
In Deutschland:
!!! http://www.oecd.org/berlin/publikationen/Zuordnung%20nationaler%20Bildungsprogramme%20zur%20ISCED%202011.pdf
!!! https://www.arbeitsagentur.de/bildung/schule/zweiter-bildungsweg
https://www.kmk.org/fileadmin/Dateien/pdf/Bildung/AllgBildung/Schema-Bildungsgaenge_und_Schularten-Stand_2019-01.pdf
http://www.ibe.unesco.org/sites/default/files/Germany.pdf
!!! (Bildungsfinanzbericht, Seite 90) https://www.destatis.de/DE/Themen/Gesellschaft-Umwelt/Bildung-Forschung-Kultur/Bildungsfinanzen-Ausbildungsfoerderung/Publikationen/Downloads-Bildungsfinanzen/bildungsfinanzbericht-1023206197004.pdf?__blob=publicationFile
ISCED-0 = Kindergarten
ISCED-1 = Grundschule
ISCED-2 = Hauptschulen / Realschulen -> Realschulabschluss / Hauptschulabschluss / (Qualifizierender) Hauptschulabschluss / Mittlerer Bildungsabschluss
ISCED-3 = Oberstufe / Sekundarstufe II -> Abitur
ISCED-4 = Fachoberschulen / Berufsschulen / Kollegs -> Fachhochschulreife / Fachgebundene Hochschulreife(Fachabitur)
ISCED-5 = Meisterausbildung -> Meister
ISCED-6 = Bachelorstudiengänge / Diplomstudiengang(FH) -> Bachelor / Diplom(FH)
ISCED-7 = Masterstudiengänge / Diplomstudiengang(Universität) -> Master / Diplom(Uni)
ISCED-8 = Promotionsstudium -> Doktor / PhD
Fields of education are defined in ISCED-F 2013.
https://ec.europa.eu/eurostat/statistics-explained/index.php/International_Standard_Classification_of_Education_(ISCED)#Implementation_of_ISCED_2011_.28levels_of_education.29
http://www.uca.es/recursos/doc/Unidades/Oficina_RRII/Erasmus/Erasmus_KA107/671196821_642017113617.pdf
Helpfull: http://uis.unesco.org/en/glossary
---------------------------------------------------------------------------------------
# Language
* (Elementary proficiency] Grundkenntnisse
* (Limited working proficiency) Eingeschränkte Arbeitsfähigkeit
* (Professional working proficiency) Professionelle Arbeitsfähigkeit
* (Full professional proficiency) Volle fachliche Kompetenz
* (Native or bilingual proficiency) Muttersprache oder Zweisprachig
Grundkenntnisse
Eingeschränkte Arbeitsfähigkeit
Professionelle Arbeitsfähigkeit
Volle fachliche Kompetenz
Muttersprache
https://englishwithkim.com/english-level-language-skills/
https://corporatefinanceinstitute.com/resources/careers/resume/language-proficiency-levels/
---------------------------------------------------------------------------------------
# Diskriminierung
https://de.wikipedia.org/wiki/Diskriminierung#Soziale_Diskriminierung_(Soziologie)
* Abstammung (Rasse), Hautfarbe oder Ethnie, nationale Herkunft (Fremdenfeindlichkeit, Rassismus, Antisemitismus, Antiziganismus, übersteigerter Nationalismus, Chauvinismus)
* Geburt, soziale Herkunft oder wirtschaftliche Verhältnisse, Sprache oder Alter (Klassismus, Altersdiskriminierung)
* Geschlecht (Sexismus, Transphobie)
* Religion (Christenverfolgung, Judenfeindlichkeit, Islamophobie)
* politische oder sonstige Überzeugung (politische Verfolgung, Diskriminierung von Atheisten und Agnostikern)
* sexuelle Orientierung (Heterosexismus, Homophobie)
* körperliche oder geistige Fähigkeiten und körperliches Erscheinungsbild (Ableism, Behindertenfeindlichkeit, Lookism, Audismus)
* Artzugehörigkeit und genetischer Code (Speziesismus)
* ethnische Herkunft oder Hauttyp
* Geschlecht oder Gender
* sexuelle Orientierung
* Alter
* Behinderung oder chronische Krankheit
* Religion oder Weltanschauung
* Vermögen oder sozialen Herkunft
---------------------------------------------------------------------------------------
# Disability
https://unstats.un.org/unsd/demographic-social/sconcerns/disability/index.cshtml#docs
https://unstats.un.org/unsd/publication/SeriesY/SeriesY_10e.pdf
https://unstats.un.org/unsd/demographic-social/sconcerns/disability/statistics/#/activities
### Disability categories in Sweden:
* Dyslexia and dyscalculia
* Neuropsychiatric condition
* Usual activities and tasks
* Seeing
* Anxiety and worries
* Walking and climbing stairs
* Asthma and allergy
* Hearing
https://unstats.un.org/unsd/demographic/sconcerns/disability/disabmethodsDISTAT.aspx
https://www.who.int/news-room/fact-sheets/detail/deafness-and-hearing-loss
## (WHO) WORLD REPORT ON DISABILITY
https://apps.who.int/iris/bitstream/handle/10665/70670/WHO_NMH_VIP_11.01_eng.pdf;jsessionid=6369AE93108135D8E832C48537F819CF?sequence=1
http://idrmnet.org/images/IDRM_Europe_2007.pdf
* mental impairments
* speech impairments
* sensory (visual, hearing, etc.) impairments
* mobility impairments
* metabolic impairments
* mutilating impairments
## Understanding disability
https://www.who.int/disabilities/world_report/2011/chapter1.pdf?ua=1
* __impairments__ are problems in body function or alterations in body structure for example, paralysis or blindness
* __activity limitations__ are difficulties in executing activities for example, walking or eating
* __participation restrictions__ are problems with involvement in any area of life for example, facing discrimina-tion in employment or transportation
https://www.who.int/disabilities/data/infographics-8.pdf?ua=1
## What makes the difference in peoples lives when they havea mental disorder?
https://www.who.int/disabilities/2017_Kamenov_MH_and_NCDs.pdf?ua=1
## Determinants of Work Performance in Workers with Depression and Anxiety: A Cross-Sectional Study
https://www.who.int/disabilities/data/2017-Ivandic-Work-Performance-and-determinants.pdf?ua=1
## !!! (WHO) ICF Checklist — Clinician Form for International Classification of Functioning, Disability and Health
https://www.who.int/classifications/icf/icfchecklist.pdf?ua=1
## WHODAS 2.0
https://apps.who.int/iris/bitstream/handle/10665/43974/9789241547598_eng.pdf?sequence=1
WHODAS 2.0 is a practical, generic assessment instrument that can measure health and disability at population level or in clinical practice. WHODAS 2.0 captures the level of functioning in six domains of life (3):
* Domain 1: Cognition understanding and communicating
* Domain 2: Mobility moving and getting around
* Domain 3: Self-care attending to ones hygiene, dressing, eating and staying alone
* Domain 4: Getting along interacting with other people
* Domain 5: Life activities domestic responsibilities, leisure, work and school
* Domain 6: Participation joining in community activities, participating in society.
---------------------------------------------------------------------------------------
# Kultur
https://en.wikipedia.org/wiki/Outline_of_culture
---------------------------------------------------------------------------------------
# Interessen / Hobbies
https://www.investmentmap.org/industry_classification.aspx
https://unstats.un.org/unsd/classifications/econ/
https://unstats.un.org/unsd/classifications/bestpractices/
---------------------------------------------------------------------------------------
# Age Groups
https://unstats.un.org/unsd/publications/catalogue?selectID=134
https://unstats.un.org/unsd/publication/SeriesM/SeriesM_74e.pdf
Under one, l-4, 5-14, 15-24, 25-34, 35-44, 45-54, 55-64, 65-74 and 75+ years;
Under 1, 1-14, 15-24, 25-44, 45-64 and 65+ years
0-18, 19-24, 25-34, 35-44, 55-64, 65-74 and 75+ years
---------------------------------------------------------------------------------------
# Other Stuff / Random Notes
https://www.un.org/en/gender-inclusive-language/toolbox.shtml
https://zensus2011.de
https://de.wikipedia.org/wiki/Religion
https://unstats.un.org/unsd/methodology/dataquality/references/1902216-UNNQAFManual-WEB.pdf
https://unstats.un.org/unsd/classifications/unsdclassifications/
## Fact Sheets
https://www.who.int/news-room/fact-sheets/

206
readme/Questions.md Normal file
View file

@ -0,0 +1,206 @@
# Questions
__Nur Fragen mit einer sinnvollen und einfachen Bergündung (`WHY:`) können in die Umfrage aufgenommen werden!__
Bei den Bergündungen müssen wir aufpassen, dass diese die Antwort nicht in eine bestimmte Richtung schieben!
[x] = Checkbox ()
[?] = Choose an option
[Number] = Number
Fragen:
* Sind bestimmte Fragen oder Antwortmöglichkeiten zuviel?
* Ist die Sortierung so okay?
TODOs:
Die Begründungen sollten keine Fragen sondern Aussagen sein.
## Bildung und Kultur
<highest_degree_of_education> [?] Mein höchster Bildungsabschluss ist...
(`WHY:` Aus welcher Bildungsschicht kommen unsere Mitglieder?)
* <none> Kein Abschluss
* <ISCED_1> Vollendung der Grundschule
* <ISCED_2> Haupt- / Realschulabschluss
* <ISCED_3> Abitur
* <ISCED_4> Fachhochschulreife / Fachgebundene Hochschulreife(Fachabitur)
* <ISCED_5> Meister
* <ISCED_6> Bachelor / Diplom(FH)
* <ISCED_7> Master / Diplom(Uni)
* <ISCED_8> Doktor / PhD
<good_communication_in_english> [x] Kannst du dich gut auf Englisch verständigen?
(`WHY:` Als internationale Organisation wird viel auf Englisch kommuniziert. Hiermit können wir schauen, ob mehr in die einzelnen Sprachen übersetzt werden sollte.)
<problems_with_computers> [x] Hast du gelegentlich/oft Probleme dich am Computer oder Handy zurecht zu finden?
(`WHY:` Wir schauen hiermit, wie viel wir innerhalb von Volt auf technische Lösungen setzten können?)
(`INTERNAL:` Ist diese Frage zu ungenau?)
<amount_of_kown_languages> [Number] Wie viele Sprachen kannst du sprechen/verstehen? (DGS zählt auch)
(`WHY:`: Austausch über die eigene Sprach-Bubble hinaus.)
(`INTERNAL:`: Es geht um die, daraus resultierende Möglichkeit sich mit Menschen außerhalb der eigenen Sprach-Bubble auszutauschen.)
<different_country_of_origin> [x] Lebst du in einem anderen Land als du geboren bist?
(`WHY:`: Wissen anderer Kulturen in Volt.)
(`INTERNAL:`:
Wissen anderer Kulturen in Volt.
Verschmelzen Kultureller Grenzen.
Eine Person, die vorher in einem anderen Land gelebt hat, oder Vorfahren aus einem anderen Land hat, kennt mehrere Kulturkreise und kann so eventuell besser auf nicht-deutsche Kulturen eingehen.
)
## Zu deiner Person
<gender> [?] Wie bezeichnest du dein Gender?
(`WHY:` Gender ist nicht das Geschlecht in deinem Ausweiß, sondern beschreibt die nicht an biologische Merkmale gebundenen Geschlechtsaspekte des Menschen.)
* <female> weiblich
* <male> männlich
* <non_binary> non-binary / weder weiblich noch männlich
* <gender_fluid> gender-fluid
* <not_sure> Ich bin mir nicht sicher.
* <terms_dont_fit> Diese Begriffe passen nicht zu mir.
<gender_identity> [?] Wie bezeichnest du deine Geschlechtsidentität?
(`WHY:` Um die Probleme einer Trans* Person nachvollziehen zu können, muss man selbst Trans* sein. Daher sollten wir wissen, wie gut wir zu diesem Thema aufgestellt sind.)
* <transgender> Transgender
* <cisgender> Cisgender (Das gegenteil von Transgender. Geschlecht und Gender sind gleich. / Biologisches und Soziales Geschlecht sind gleich.)
* <not_sure> Ich bin mir nicht sicher
* <terms_dont_fit> Diese Begriffe passen nicht zu mir.
<sexual_orientation> [?] Wie bezeichnest du deine sexuelle Orientierung?
(`WHY:` Wie divers sind wir im Bereich Sexuelle Orientierung aufgestellt?)
(`INTERNAL`: https://de.wikipedia.org/wiki/Sexuelle_Orientierung#Selbstidentifikation)
* <homosexual> homosexuell / lesbisch / schwul / gay / homo / ...
* <interested_in_more_than_one_gender> bisexuell / bi / ambisexuell / pansexuell / polysexuell / ...
* <queer> queer
* <asexual> asexuell
* <heterosexual> heterosexuell / straight
* <not_sure> Ich bin mir nicht sicher.
* <terms_dont_fit> Diese Begriffe passen nicht zu mir.
<discriminatory_experiences> Bei welchen Bereichen hast du schonmal diskriminierende Erfahrungen gemacht?
(`WHY:` Hier mit möchten wir herrausfinden, wie privilegiert Volt Mitglieder sind.)
[x] <ancestry> Ethnische Herkunft oder Hauttyp
[x] <sex_or_gender> Geschlecht oder Gender
[x] <sexual_orientation> Sexuelle Orientierung
[x] <age> Alter
[x] <disabilities> Behinderung oder chronische Krankheit
[x] <ideology> Religion oder Weltanschauung
[x] <classism> Vermögen oder sozialen Herkunft
[x] <other> andere Bereiche
## Beinträchtigungen und Hilfmittel
<mental_disorder> [x] Hast du - unabhängig von einer psychiatrischen Diagnose - mit anhaltenden oder immer wiederkehrenden psychischen Schwierigkeiten zu tun haben?
(`WHY:` Unsere Reaktion auf für uns ungewohntes Verhalten der Mitglieder.)
<introverted_or_extroverted> [?] Bist du eher introvertiert oder extrovertiert?
(`WHY:` Wir müssenn auch auf Mitglieder achten, die sich bei Diskussion nicht selbstständig durchsetzten? Oder denen viele Menschen ab und zu zu anstrengend sind.)
(`INTERNAL:`
Sollten wir diese Frage erstmal weglassen und erst hinzunehmen, wenn wir mehr Persönlichkeitsmerkmale abfragen?
Wen sprechen wir mit unserer Werbung an? Erreichen wir auch eher introvertierte Mesnchen?
* <terms_dont_fit> je nachdem / weder noch / kommt drauf an
)
* <more_introverted> eher introvertiert
* <more_extroverted> eher extrovertiert
<everyday_aids> Welche Hilfmittel benötigst du im Alltag?
(`WHY:` Erreichbarkeit und Verständigung bei den Events.)
(`INTERNAL:`
https://www.familienratgeber.de/rechte-leistungen/reha-therapie/hilfsmittel.php
https://www.myhandicap.de/hilfsmittel-behinderung/
<wheelchair> Rollstuhl
<rollator> Rollator
<hearing_aid> Hörgerät
<microphone> Mikrofon
<glasses> Brille
<magnifying_glass> Lupe
<prosthesis> Prothese
<orthosis> Orthese
<assistance> Assistenz (Hund, Mensch oder Roboter)
<drugs> Medikamente
<screen_reader> Screenreader
<braille_display> Brailledisplay
<other> andere Hilfmittel
)
[x] <wheelchair> Rollstuhl
[x] <rollator> Rollator
[x] <hearing_aid> Hörgerät / Mikrofon
[x] <assistance> Assistenz (Hund, Mensch oder Roboter)
[x] <other> andere Hilfmittel
<financial_help> [x] Bekommst du finanzielle Hilfe. (Bafög, Hartz4, Jugendamt, ...)
(`WHY:` Je nach verfügbarer Geldmenge kann man einfacher an bestimmten Events teilnehmen.)
-------------------------------------------------------------------------------------
# Mögliche zusätzliche Fragen
## Ess- und Trinkgewohnheiten
<vegetarian> [x] Ich lebe vegetarisch.
(`WHY:` Müssen wir darauf achten, dass vegetarische Optionen verfügbar sind?)
<vegan> [x] Ich lebe vegan.
(`WHY:` Müssen wir darauf achten, dass vegane Optionen verfügbar sind?)
<no_alcohol> [x] Ich möchte/soll keinen Alkohol trinken.
(`WHY:` Können/Sollten wir Events in Bars oder ähnlichem veranstalten?)
<presence_of_food_allergies> [x] Ich habe Allergien durch die ich nicht jedes Essen/Getränk vertrage. (Laktose, Gluten, ...)
(EN: I have allergies that make me not be able to tolerate every kind of food/drink.)
(`WHY:` Laktose, Gluten und andere Unverträglichkeiten sind poltitisch aufgeladen. Wir schauen mit dieser Frage, wie gut wir uns intern mit dem Thema auskennen.)
## Familie
<amount_of_romantic_relationships> [Number] Mit wie viel Menschen bist du gerade in einer Beziehung? (Unabhänig ob Ehe, Partnerschaft oder andere Arten einer romantischen Beziehung) (0=single,1=monogam,2=polygam,...)
(`WHY:` )
(`INTERNAL:` Sollten wir uns nur auf Ehe und Partnerschaft beschränken?)
<amount_of_kids> [Number] Wie viele Kinder hast du gerade?
(`WHY:` )
## Kultur
Religion
Interessen/Hobbies

104
stats.js Normal file
View file

@ -0,0 +1,104 @@
const https = require('https')
const { acceptedLanguages } = require('@fluent/langneg')
function trackPageview(payload, headers) {
const data = JSON.stringify({
payload: {
website: '', // 'your-website-id',
url: '/',
referrer: '',
hostname: '', // 'your-hostname',
language: '', // 'en-US',
screen: '', // '1920x1080',
...payload,
},
type: 'pageview'
})
const req = https.request({
hostname: 'umami.qiekub.org',
port: 443,
path: '/api/collect',
method: 'POST',
headers: {
'User-Agent': headers['user-agent'] || '',
'Accept-Language': headers['accept-language'] || '',
'Content-Type': 'application/json',
'Content-Length': data.length,
}
}, null)
req.on('error', error => console.error(error))
req.write(data)
req.end()
}
function trackEvent(payload, headers) {
const data = JSON.stringify({
payload: {
website: '', // 'your-website-id',
url: '/',
event_type: 'custom', // 'click',
event_value: '', // 'signup-button',
hostname: '', // 'your-hostname',
language: '', // 'en-US',
screen: '1920x1080',
...payload,
},
type: 'event'
})
const req = https.request({
hostname: 'umami.qiekub.org',
port: 443,
path: '/api/collect',
method: 'POST',
headers: {
'User-Agent': headers['user-agent'] || '',
'Accept-Language': headers['accept-language'] || '',
'Content-Type': 'application/json',
'Content-Length': data.length,
}
}, null)
req.on('error', error => console.error(error))
req.write(data)
req.end()
}
function sendInitialStats({
website = '',
url = '/',
hostname = ''
}, headers = {}) {
const userLocales = acceptedLanguages(headers['accept-language'] || '')
if (!!userLocales || Array.isArray(userLocales)) {
const defaultPayload = {
website,
url,
hostname,
language: userLocales.length > 0 ? userLocales[0] : '',
}
trackPageview(defaultPayload, headers)
for (let locale of userLocales) {
locale = locale.toLowerCase() // Not really correct but the system locales sadly don't conform to the standard.
const language = locale.split('-')[0]
if (language !== locale) {
trackEvent({
...defaultPayload,
event_value: `L: ${language}`, // Log just the language.
}, headers)
}
trackEvent({
...defaultPayload,
event_value: `L: ${locale}`, // Log the full locale.
}, headers)
}
}
}
module.exports = {
sendInitialStats,
}