Coder Social home page Coder Social logo

messa / pyladies-courseware Goto Github PK

View Code? Open in Web Editor NEW
18.0 7.0 26.0 6.13 MB

Homework/task submit and review web app · based on React and Python aiohttp

Home Page: https://projekty.pyladies.cz/

License: MIT License

Makefile 0.10% JavaScript 5.35% CSS 88.04% Python 6.25% Dockerfile 0.09% Shell 0.03% Jinja 0.14%
python3 aiohttp-server nextjs mongodb motor asyncio semantic-ui python aiohttp react

pyladies-courseware's Introduction

Pyladies Courseware

Nástroj pro odevzdávání a review domácích úkolů z programování.

CircleCI

Production deployment: https://projekty.pyladies.cz/

Demo (reseted on every deploy): https://projekty-demo.messa.cz/

Todo

Next steps:

  • dokončit workflow pro review úkolů
  • rozběhat FB a Google login
  • přidat Github login
  • někam to nasadit :)
  • udělat notifikace
    • uvnitř aplikace
    • do Slacku
    • e-mail
    • debouncing (neposílat každou zvlášť, ale agregovat)
  • dodělat admin uživatelů, ať se dají přiřazovat studenti a koučové do jednotlivých kurzů

Dlouhodoběji:

  • odevzdávání přes Github

Viz také issues.

Pokud máte dotaz nebo chcete spustit diskuzi nad některým todo, založte issue (pokud už takové neexistuje).

Architecture

Uses React frontend based on Next.js and Python backend based on aiohttp.server.

browser --> nginx
              - /* ------------> node.js frontend
              - /api, /auth ---> Python aiohttp backend ---> MongoDB  

Why React:

  • the site will be very dynamic, with complex forms, no-reload page updates, notifications etc. React enables to do this on client-side easily
  • so far we keep the code as simple as possible - no redux, no graphql etc., just "classic" React component state

Why Next.js:

  • handles all the boring stuff: webpack, routing, code splitting...
  • we just write the React components, nothing else, no server-side code (except getInitialProps)
  • we don't even use "nice" dynamic URLs to keep things as simple as possible
    • URL /lesson?courseId=abc is served from pages/lesson.js with props: { query: { courseId: 'abc' }}

Why Python backend:

  • the language we all love :)
  • libraries for everything
  • more mature language for business logic and advanced I/O, process management etc.
  • API backend is more responsive when the HTML server-rendering is outsourced to client process (or to static files)

Why aiohttp:

  • supports websockets natively
  • enables the server to be single-process, single-thread, so things like notification broadcasting become much easier
  • powerful enough (just serves JSON API, no template rendering)
  • the MongoDB asyncio client motor is a "first-class" MongoDB client library

Why MongoDB:

  • provides all we need
  • "operations friendly" - replication, migration etc. much easier than with *SQL
  • MongoDB and its Python client motor provide nice asyncio API

Requirements

  • Node.js >= 10.0
  • Python >= 3.6
    • Ubuntu: install also python3-venv
  • MongoDB
    • via Docker: docker run --rm -it -p 27017:27017 mongo:4

Local Development

Ve 3 samostatných konzolích spusť:

$ make run-mongod
$ make run-backend
$ make run-frontend

Otevři http://localhost:3000/

Port Služba
3000 Node.js – frontend
5000 aiohttp – backend
27017 MongoDB

Při změně kódu Python backendu je potřeba restartovat proces (tj. znovu spustit make run-backend). Pro automatizaci tohoto lze použít nějaký watchdog, např. watch_files.py.

Developer login

Pro usnadnění vývoje na localhostu, je možné (v defaultu automaticky) zapnout tlačítka přihlášení různých rolí.

local dev login

Usage:

# in the backend directory
$ export ALLOW_DEV_LOGIN=1
$ make run-backend

Project structure

pyladies-courseware
├── Dockerfile
├── Makefile
├── backend
│   ├── Makefile
│   ├── cw_backend
│   │   ├── __init__.py
│   │   ├── __main__.py
│   │   ├── configuration.py
│   │   ├── courses.py
│   │   ├── main.py
│   │   ├── model
│   │   ├── util
│   │   └── views
│   ├── requirements-tests.txt
│   ├── requirements.txt
│   ├── setup.py
│   └── tests
│       ├── conftest.py
│       ├── data
│       ├── model
│       │   ├── test_users.py
│       │   └── ...
│       ├── ...
├── data - course, session and task data
├── frontend
│   ├── components
│   │   ├── ALink.js
│   │   ├── CodeEditor.js
│   │   ├── Header.js
│   │   ├── HomeworkComments.js
│   │   ├── ...
│   │   ├── admin
│   │   └── forms
│   ├── package-lock.json
│   ├── package.json
│   ├── pages
│   │   ├── admin
│   │   │   └── users.js
│   │   ├── course.js
│   │   ├── index.js
│   │   ├── lesson.js
│   │   ├── login.js
│   │   └── profile.js
│   ├── static
│   └── util
└── resources - images for README etc.
    └── local_dev_login.png

Poznámky

Nějaký pokus o přepsání domácích úkolů proběhl zde: pyvec/naucse.python.cz#153

pyladies-courseware's People

Contributors

befeleme avatar brabemi avatar dependabot[bot] avatar disi77 avatar encukou avatar fivaldi avatar frenzymadness avatar hroncok avatar jahodfra avatar janaslo avatar jirkav avatar kobzol avatar messa avatar mintaka avatar petravidnerova avatar radzuka avatar vasekch avatar veronikks avatar zitkat avatar zuzanita avatar zuzejk avatar

Stargazers

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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

pyladies-courseware's Issues

Priznaky kurzu - uzavreny, skonceny

Pridat ke kurzu priznaky uzavreny + skonceny a reflektovat v UI

uzavreny - po kliknuti na kurz se uzivatel automaticky nestane studentem
skonceny - vypnout vsechny inputy (odevzdani, komentovani), uvest do read-only

Využít nějak spectrum.chat?

https://spectrum.chat/features

Kdo už to používá: https://spectrum.chat/explore

Dal by se vytvořit "kanál" pro celé odevzdávátko jako takové (hlavně technický support). Případně i samostatné kanály pro každý kurz, to by se ale krylo s FB skupinami (tak jak byly doteď).

Taky by se do toho dalo nějak zapojit propojení přes API/bot - např. automaticky posílat nějaké informace/notifikace o úkolech.

Jo a je to opensource :) https://github.com/withspectrum/spectrum

Testovací "komunita" na vyzkoušení: https://spectrum.chat/test20181230/join/b0c020b2-167e-4e2a-917e-b16cd5c52d11

Alternativou pro nějaký chat je Telegram. Ten je takový víc Slackovější. A samozřejmě je alternativou i Slack, ale když už něco jako Slack, tak bych raději Telegram :)

Task automatic tests

Ke každému úkolu by mělo být možné přiřadit kontrolu tak a pokud kontrola neprojde, tak by úkol měl být automaticky opatřen nastavenou odpovědí.

(nejčastější odpovědi)
Nevalidní syntax
Chyba
Timeout
Padající testy

Review review

Připravit workflow, které umožní snadno věnovat pozornost aktivitám od čerstvých koučů. Možná se inspirovat na StackOverflow.

Allow assign tasks to sessions via Naučse lessons

A course has sessions.

A session is identified by course id and session slug, and has date, title, materials and tasks.

Tasks are loaded from yaml+markdown files – path(s) to these files must be somehow provided in the session metadata (loaded from the course yaml file). For example: course_ntk.yaml

Naučse API provides one more level of abstraction – lesson. Naučse lesson is a study material (or collection of materials?) for one specific topic, and lessons are assigned to specific course sessions. The session materials are actually provided from lessons assigned to the given session.

Courseware should allow to assign tasks (probably whole yaml+markdown tasks file) to given lesson (identified by lesson_slug) and then aggregate session tasks from tasks assigned to lessons assigned to given session.

Notice: one set of tasks (task files) are usually shared between multiple courses in given time+city, so a task can be assigned to a different session (or naučse lesson) in each course. All this session/lessontask assignment should be done only for the scope of the given course. (The sessionlesson assignment provided by Naučse API is also provided just for the given course.)

Vyřešit zapisování studentů do kurzů

Typicky na začátku kurzu (první nebo druhý týden) je potřeba tam všechny dostat. A to co nejvíc "blbuvzdorně" (ne, že by to někdo nezvládl, ale už tak mají hromadu věcí k přemýšlení).

Jak to řešit:

  • prostě tlačítko v kurzu "Chci se do tohoto kurzu přihlásit jako účastník" :) (nápad od @vasekch)

  • nějaký kouzelný odkaz, který by se nějak rozdistribuoval mezi studenty (mailem třeba)?

Krajní situace, které by bylo fajn vzít v potaz:

  • Pokud člověk není přihlášen, tak by ho UI mělo navést k přihlášení. (Tj. ne že pro nepřihlášené uživatele bude tlačítko pro zápis do kurzu úplně schované a nikde žádné info 😄)

  • Občas se objeví někdo, kdo ještě v pátém týdnu neví, že odevzdávátko vůbec existuje - pokud možno myslet na to, aby i tito věděli, kudy kam a co mají dělat.

  • Někdo jednorázově navštíví jiný kurz (jiný den v týdnu), tak nějak vykomunikovat, kde má vlastně odevzdávat (@vasekch říká, že tam, kam zrovna přijdou, ale já si myslím, že spíš tam, kam mají správně chodit, protože jinak přestává fungovat přehled celkové odevzdanosti úkolů).

  • Někdo natrvalo přejde z jednoho kurzu do druhého. Což je vlastně změna "kurzu, kam má správně chodit", takže tím se mění i to, kam by měl odevzdávat :)

Bonus: taky by se člověk mohl chtít odhlásit :)


Na podzim 2018 se zapisování studentů do kurzů řešilo takovým hackem, že vlastně každý, kdo navštívil stránku kurzu a zároveň byl přihlášený, tak byl do toho kurzu automaticky zapsán. Na jednu stranu je to pro studenty až triviálně jednoduché, ale dělá to pak bordel např. v přehledu odevzdaných úkolů.

Strukturovaný feedback

Idea od @Mintaka na Pyvu :) Prý jednou dělal nějaký podobný nástroj pro kurzy, kde lidi pracovali hodně samostudiem. V tom nástroji byl seznam skillů v podobě 2-3 úrovňového seznamu a lidi si tam zaškrtávali (nebo hvězdičkovali) co už umí a jak moc. Případně k tomu mohli dát štítek, že by s tím chtěli pomoct apod.

Podobný typ feedbacku by se mohl připravit i do Pyladies odevzdávátka (tj. tohoto projektu).

Odlisit ikonku stareho odevzdani a aktualizovaneho

Jako kouc, ktery uz jednou projekty prosel mam problem, ze nevim, ktera z prazdnych kulicek reprezentuje nove odevzdane reseni (aktualizovane) a ktere je tam od minula (napr. nebylo uplne spravne a vyjadril jsem se k nemu v komentari)

Fix default task id assignment when lesson slug is also default

Psal jsem na Slack:

Stala se taková vtipná věc 🙂 Lekce 3. a dál neměly vyplněný slug, takže default slug byl None. Id tasku, pokud není explicitně uvedené task_id v handoutN.yaml, se defaultně určí jako f'{lesson_slug}-{task_number}'. Takže když víc lekcí nemá vyplněný slug, jejich úkoly se navzájem provážou 😅 Opraveno

(resp. těm lessons se slug nastaví defaultně na číslo lekce, ale to se děje až po tom, co jsou načtené úkoly)

Localization

Should we plan to use this app more widely?
Then we shouldn't limit ourselves to Czech. At least issues, TODO, code should be in English and interface should be i18n.

Make the website static

Current architecture is:

browser --> nginx 
              - /* ------------> node.js frontend
              - /api, /auth ---> Python aiohttp backend ---> MongoDB  

It is possible to make the frontend part generated to set of static files, so no node.js process would bee needed on run time (only on build time). Those static files could be served by nginx, by some CDN from static storage (like AWS S3) or by the aiohttp server.

browser --> nginx or CDN
              - /* ------------> static files (next.js export)
              - /api, /auth ---> Python aiohttp backend ---> MongoDB  

Or just

browser --> Python aiohttp server --> static files (next.js export)
                                  --> MongoDB

The deployment could be easier then.

The only limitation is that we don't want to have to deal with cross-origin requests, so both frontend/static files and backend should be on the same hostname.

Proof of concept: https://github.com/messa/aiohttp-nextjs-demo-chat

pridat do role student priznak hidden

Jako kouc mam problem, ze se mi v tabulce udevzdani pletou ostatni koucove.

Navrh:

  • Do role student pridat priznak hidden.
  • Pridat k tabulce odevzdani prepinacek "zobrazit schované" nebo nejaka lepsi textace, ktera me ted nenapada

Figure out how to work with task images

Right now images for tasks (mostly diagrams) are in the static folder (frontend/static/tasks). That's not very scalable. Images should be closer to task data, for example right in data/2018_pyladies_praha_autumn/homeworks.

Things to think about:

  • Leverage git LFS somehow? Probably should not be needed - the images are small (in file size) so far.

  • Right now the images are just screenshots of the original homework handout PDFs. But in future the images will be generated from some kind of original file (sometimes even source code). Maybe some Makefile would be enough for handling this? Should be the resulting images commited to git? (I think yes.)

  • All course data, including task data and images, should be archived after the course ends and new courses should have their own fresh copy. If there will be any larger images this could be a problem in the future - git can handle copied files easily (AFAIK), but when checked out on dev machine (or even production server) it must not take gigabytes.

zamyslet se nad autozapisovanim do kurzu po prvni navsteve

Kdyz chodi koucove po ruznych kurzech, tak jsou zapsani jako studenti a dela to bordel. Navic nektere ucastnice to delaji taky, nektere ze zvedavosti, nektere protoze chteji odevzdat na vice mist (napr. zmenili kurz, nahrazuji si hodinu), vzdycky by asi meli odevzdavat tam, kam prijdou, at se jim k tomu muze kouc vyjadrit...

asi bych tuhle featuru obetoval a dovnitr do kurzu dal zapinac "prihlasit se jako ucastnik", odhlasit se nepujde, ale mohl by se clovek (kouc nebo ucastnice) sam schovat (viz. #19 ).

Setkání 2019-01-08

Nápady - k toolu i k obsahu (tj. domácím úkolům/úlohám/projektům v něm)

Zobrazení úkolů

  • na zacatku v lekci ukazat jen par ukolu (nazvěme je "prioritní"), po jejich vyhotoveni zbytek
    • jinak mají lidi snahu dodělat úplně všechny úkoly z druhé lekce, když už by spíš měli šestou
    • možná se lidi cítí přehlcení, když to otevřou a uvidí 20 úkolů
  • využít testy
    • ne progtest :) není potřeba automatické vyhodnocování, asi by to ani nebylo pedagogicky vhodné
      • automatické vyhodnocení leda tak jako info pro kouče, nebo jako "nefunguje ti to" pro studenty (#38)
    • odevzdávátko by mělo ty testy nějak poskytnout ke stažení
      • mohlo by to dát dohromady testy ze všech úkolů a nabídnout je v jednom zipu
  • stránka s přehledem všech odevzdaných úkolů v dané lekci
    • "dlouhá nudle řešení všech holek pod sebou"
  • studentky chtějí vidět řešení úlohy. Ale spíš asi na hodině? Není dořešené.
    • řešení by mohly být aspoň u některých úloh
    • řešení by mohlo být vidět až po odevzdání
    • padl nápad mít stránku s přehledem řešení a komentářů (i z jiných a minulých kurzů) k danému úkolu
      • ale zase pokud je s úlohou problém, tak by se spíš mělo změnit zadání

UI okolo odevzdávání řešení

  • mít možnost pro kouče zobrazit řešení konkrétní úlohy ode všech studentů (#18)
  • moznost videt, ze se neco noveho stale nekde, kde jsem komentoval/hodnotil/...
    • např. v tabulce mít kromě kolečka/fajfky i další symbol pro "čeká na reakci kouče" (#13, #16)
      • aby byl viděl stav: "čeká na kouče", "čeká na účastnici", nebo "všichni jsou spokojení"
      • ale ještě víc zvýraznit ty případy, kde jsem předtím něco psal já
  • vyznačit nějak, že je odevzdaná novější verze kódu
    • myslí se tím to, že pak nesedí obsah staršího komentáře s tím, co je zrovna teď čerstvě odevzdané
  • vidět předchozí verze odevzdaného kódu
  • při kliknutí na kolečko to neskočí přímo na ten úkol (asi #17)
    • opravit scroll - hlavně dvojité klikání z tabulky
  • mít možnost reagovat na konkrétní řádek: např. čísla řádků :)
  • syntax highligting odevzdaného kódu (#27)
  • lajkování konkrétních řešení úloh
    • hezká řešení lze použít pro ukázku v hodině, nebo zobrazovat jako ukázková řešení v odevzdávátku
    • řešení s nějakou typickou chybou lze ukázat a projít v hodině

UI pro kouče (kromě již výše zmíněných věcí)

  • pro organizátorky mít možnost pročistit a deduplikovat seznam účastníků v lekci, aby pak i ta tabulka dávala víc smysl (#19)
  • prioritní fronta
    • Miro: nejdéle čekající úlohu na začátek. Když přijdu a je 200 akcí, tak kterou začít.
    • že přijdu do odevzdávátka a vidím přehled, čemu se věnovat, je vlastně důležitější, než že mi přijde notifikace, že je potřeba něco dělat, nebo dokonce než že mi přijde 200 notifikací
  • organizátorky kurzů si tak nějak managují, zda jsou úkoly zkontrolované apod. - tento use case nějak podpořit

UI pro účastnice

  • přehled pro účastnice, co už mají hotové a co ne - ta tabulka s fajfkama je totiž vidět jen pro kouče. Tabulka pro účastnici by mohla být přes všechny lekce.
  • notifikace pro studentky
    • že jim kouč odpověděl
  • obecně směrovat studentky k tomu, aby odevzdávaly spíš čerstvé úlohy, než furt řešit staré

Procesy

  • kontrolovat/dávat feedback primárně k prioritním úlohám

Obsah - samotné ty úkoly

  • úkoly smerovat k zaverecnemu projektu (napr. pokud bude had, tak klast duraz na hadi ulohy)
  • podívat se na API naučse pro konzumaci struktury kurzů
  • shodli jsme se na určitých úpravých struktury lekcí, v únoru na sprintu (10.2.?) je to potřeba zrealizovat

Ostatní

  • podívat se na API naučse, prý je nějaké PR s API s daty kurzů
  • napsat Radkovi :) A možná celkově přidat návod pro kontributory?

Vylepšit UX login stránky

Rád byl, aby se lidi přihlašovali přes sociální sítě - Facebook nebo Google login tlačítko, v budoucnu přibude i Github. Nemusí se řešit reset hesla, validace e-mailu, informace zůstávají aktuální. Přihlášení přes e-mail a heslo je spíš jen fallback.

Dostal se ke mě feedback, že aktuální podoba login stránky lidi ale směřuje právě k registraci heslem. Nejspíš mají lidi zafixováno, že se nejdřív musí zaregistrovat, než mohou začít službu používat, no a ty login tlačítka přes FB/Google nejsou označená jako že fungují i jako registrace.

umoznit administrovat role

Jako admin bych chtel mit moznost pridat kouce do kurzu.

Take bych u role student chtel nastavit priznak hidden, viz #19

možnost upravovat odpovědi

V případě, že odpovídám koučovi, nemám možnost svoji odpověď opravit (ať už udělám hrubku nebo mě napadne doplnění, upřesnění). Často je přehlednější upravit komentář než psát nový, doplňující. Mohlo by se zamknout pro úpravy poté, co kouč odpoví.

Read data from naučse.python.cz

Naučse will provide API with

  • course and lesson structure: pyvec/naucse.python.cz#431
  • homework data (probably JSON endpoint with rendered homework HTML and metadata)

Ideally this courseware should be pluggable to any lesson and homework data provider with similar API.

Žádost o kontrolu úkolu

Při odpovědi uživatel může zaškrtnout, zda je potřeba úkol znovu zkontrolovat - pokud odpoví kauč může tento příznak odebrat. Úkoly s příznakem by měly být zvýrazněny.

Všechny úkoly s příznakem by měly být viditelné na stránce kurzu (napříč všemi lekcemi).

Můžu to použít?

Tenhle projekt nemá licenci. Můžu si ho stáhnout/vyzkoušet/upravit?

Ve frontend/package.json je uvedená ISC, která umožňuje spouštění/změny/šíření pokud k tomu vždycky přiložíš text licence – ale samotný text licence chybí :(

Příprava na jarní kurzy 2019

Na lednovém setkání jsme probrali, co by bylo vhodné udělat: #44

V tomto issue je přehled nejdůležitějších věcí, aby se dalo na jaře vůbec začít:

✅ načítání struktury kurzů z naučse API (#4)
✅ přiřazení domácích úkolů k jednotlivým sessions - Plzeň (#49, sprint?)
✅ přiřazení domácích úkolů k jednotlivým sessions - Praha (#49, sprint, #44)
✅ vyřešit zapisování účastníků do příslušných kurzů (#46)
✅ intro do odevdávátka pro @Mintaka (nebo případně nějaká obecnější dokumentace)

Přidat og:image

O co jde - když se na FB nebo jiné soc síti sdílí odkaz do odevzdávátka, tak to k tomu přidává nějaký obrázek. Pomocí atributu og:image (typicky v <meta> v <head>) se toto dá ovlivnit.

Klidně bych i do toho og:image generoval název kurzu :)

Takhle to vypadá, když není nastavený og:image a Facebook si tak vezme jakýkoliv vhodný obrázek najde:

image

umoznit pohled na ruzne reseni jednoho ukolu

Umoznit prochazet ukoly postupne podle cisla pro vsechny ucastnice.
Tenhle pohled by mohl slouzit taky pri demonstraci ukolu na kurzu, stacilo by schovat jmena a komentare...

Recommend Projects

  • React photo React

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

  • Vue.js photo Vue.js

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

  • Typescript photo Typescript

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

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

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

Recommend Topics

  • javascript

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

  • web

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

  • server

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

  • Machine learning

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

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

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

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.