├── .circleci
└── config.yml
├── .gitignore
├── CHANGELOG.md
├── Dockerfile
├── LICENSE
├── MANIFEST.in
├── README.md
├── backoffice
├── __init__.py
├── admin.py
├── certificate_manager
│ ├── __init__.py
│ ├── tasks.py
│ ├── urls.py
│ ├── utils.py
│ ├── verified.py
│ └── views.py
├── forms.py
├── locale
│ └── fr
│ │ └── LC_MESSAGES
│ │ ├── django.mo
│ │ └── django.po
├── middleware.py
├── migrations
│ ├── 0001_initial.py
│ └── __init__.py
├── models.py
├── ora2_submissions
│ ├── __init__.py
│ ├── tasks.py
│ ├── tasks_api.py
│ ├── tests.py
│ ├── urls.py
│ └── views.py
├── static
│ └── backoffice
│ │ ├── datetimepicker
│ │ ├── css
│ │ │ └── bootstrap-datetimepicker.css
│ │ └── js
│ │ │ ├── bootstrap-datetimepicker.js
│ │ │ └── moment.js
│ │ └── js
│ │ └── pending_tasks.js
├── templates
│ └── backoffice
│ │ ├── article.html
│ │ ├── articles.html
│ │ ├── base.html
│ │ ├── certificate-confirm-modal-dialog.html
│ │ ├── certificate.html
│ │ ├── courses
│ │ ├── base-detail.html
│ │ ├── detail.html
│ │ ├── list.html
│ │ ├── users.html
│ │ └── wiki.html
│ │ ├── modal_forms
│ │ ├── ban_user.html
│ │ ├── base_modal_form.html
│ │ ├── change_grade.html
│ │ ├── change_mode.html
│ │ └── change_password.html
│ │ ├── ora2_submissions
│ │ └── status.html
│ │ ├── user.html
│ │ └── users.html
├── templatetags
│ ├── __init__.py
│ ├── course.py
│ └── tables.py
├── tests
│ ├── __init__.py
│ ├── factories.py
│ ├── proctoru_data.json
│ ├── test.py
│ ├── test_certificates.py
│ ├── test_course_list.py
│ ├── test_microsites.py
│ ├── test_middleware_masquerade.py
│ ├── test_news.py
│ └── test_users.py
├── urls.py
├── utils.py
└── views
│ ├── __init__.py
│ ├── courses_views.py
│ ├── news_views.py
│ └── users_views.py
├── course_dashboard
├── __init__.py
├── locale
│ └── fr
│ │ └── LC_MESSAGES
│ │ ├── django.mo
│ │ └── django.po
├── problem_stats
│ ├── __init__.py
│ ├── problem_monitor.py
│ ├── question_monitors.py
│ ├── tests
│ │ ├── __init__.py
│ │ ├── sample_courses.py
│ │ ├── test_build_course_tree.py
│ │ ├── test_problem_monitor.py
│ │ ├── test_question_monitors.py
│ │ ├── test_utils.py
│ │ └── test_views.py
│ ├── urls.py
│ ├── utils.py
│ └── views.py
├── reports_manager
│ ├── __init__.py
│ ├── tasks.py
│ ├── tests
│ │ ├── test_tasks.py
│ │ ├── test_utils.py
│ │ └── test_views.py
│ ├── urls.py
│ ├── utils.py
│ └── views.py
├── static
│ └── course_dashboard
│ │ ├── flags
│ │ ├── css
│ │ │ └── flag-icon.min.css
│ │ └── flags
│ │ │ ├── 1x1
│ │ │ ├── ad.svg
│ │ │ ├── ae.svg
│ │ │ ├── af.svg
│ │ │ ├── ag.svg
│ │ │ ├── ai.svg
│ │ │ ├── al.svg
│ │ │ ├── am.svg
│ │ │ ├── ao.svg
│ │ │ ├── aq.svg
│ │ │ ├── ar.svg
│ │ │ ├── as.svg
│ │ │ ├── at.svg
│ │ │ ├── au.svg
│ │ │ ├── aw.svg
│ │ │ ├── ax.svg
│ │ │ ├── az.svg
│ │ │ ├── ba.svg
│ │ │ ├── bb.svg
│ │ │ ├── bd.svg
│ │ │ ├── be.svg
│ │ │ ├── bf.svg
│ │ │ ├── bg.svg
│ │ │ ├── bh.svg
│ │ │ ├── bi.svg
│ │ │ ├── bj.svg
│ │ │ ├── bl.svg
│ │ │ ├── bm.svg
│ │ │ ├── bn.svg
│ │ │ ├── bo.svg
│ │ │ ├── bq.svg
│ │ │ ├── br.svg
│ │ │ ├── bs.svg
│ │ │ ├── bt.svg
│ │ │ ├── bv.svg
│ │ │ ├── bw.svg
│ │ │ ├── by.svg
│ │ │ ├── bz.svg
│ │ │ ├── ca.svg
│ │ │ ├── cc.svg
│ │ │ ├── cd.svg
│ │ │ ├── cf.svg
│ │ │ ├── cg.svg
│ │ │ ├── ch.svg
│ │ │ ├── ci.svg
│ │ │ ├── ck.svg
│ │ │ ├── cl.svg
│ │ │ ├── cm.svg
│ │ │ ├── cn.svg
│ │ │ ├── co.svg
│ │ │ ├── cr.svg
│ │ │ ├── cu.svg
│ │ │ ├── cv.svg
│ │ │ ├── cw.svg
│ │ │ ├── cx.svg
│ │ │ ├── cy.svg
│ │ │ ├── cz.svg
│ │ │ ├── de.svg
│ │ │ ├── dj.svg
│ │ │ ├── dk.svg
│ │ │ ├── dm.svg
│ │ │ ├── do.svg
│ │ │ ├── dz.svg
│ │ │ ├── ec.svg
│ │ │ ├── ee.svg
│ │ │ ├── eg.svg
│ │ │ ├── eh.svg
│ │ │ ├── er.svg
│ │ │ ├── es.svg
│ │ │ ├── et.svg
│ │ │ ├── fi.svg
│ │ │ ├── fj.svg
│ │ │ ├── fk.svg
│ │ │ ├── fm.svg
│ │ │ ├── fo.svg
│ │ │ ├── fr.svg
│ │ │ ├── ga.svg
│ │ │ ├── gb.svg
│ │ │ ├── gd.svg
│ │ │ ├── ge.svg
│ │ │ ├── gf.svg
│ │ │ ├── gg.svg
│ │ │ ├── gh.svg
│ │ │ ├── gi.svg
│ │ │ ├── gl.svg
│ │ │ ├── gm.svg
│ │ │ ├── gn.svg
│ │ │ ├── gp.svg
│ │ │ ├── gq.svg
│ │ │ ├── gr.svg
│ │ │ ├── gs.svg
│ │ │ ├── gt.svg
│ │ │ ├── gu.svg
│ │ │ ├── gw.svg
│ │ │ ├── gy.svg
│ │ │ ├── hk.svg
│ │ │ ├── hm.svg
│ │ │ ├── hn.svg
│ │ │ ├── hr.svg
│ │ │ ├── ht.svg
│ │ │ ├── hu.svg
│ │ │ ├── id.svg
│ │ │ ├── ie.svg
│ │ │ ├── il.svg
│ │ │ ├── im.svg
│ │ │ ├── in.svg
│ │ │ ├── io.svg
│ │ │ ├── iq.svg
│ │ │ ├── ir.svg
│ │ │ ├── is.svg
│ │ │ ├── it.svg
│ │ │ ├── je.svg
│ │ │ ├── jm.svg
│ │ │ ├── jo.svg
│ │ │ ├── jp.svg
│ │ │ ├── ke.svg
│ │ │ ├── kg.svg
│ │ │ ├── kh.svg
│ │ │ ├── ki.svg
│ │ │ ├── km.svg
│ │ │ ├── kn.svg
│ │ │ ├── kp.svg
│ │ │ ├── kr.svg
│ │ │ ├── kw.svg
│ │ │ ├── ky.svg
│ │ │ ├── kz.svg
│ │ │ ├── la.svg
│ │ │ ├── lb.svg
│ │ │ ├── lc.svg
│ │ │ ├── li.svg
│ │ │ ├── lk.svg
│ │ │ ├── lr.svg
│ │ │ ├── ls.svg
│ │ │ ├── lt.svg
│ │ │ ├── lu.svg
│ │ │ ├── lv.svg
│ │ │ ├── ly.svg
│ │ │ ├── ma.svg
│ │ │ ├── mc.svg
│ │ │ ├── md.svg
│ │ │ ├── me.svg
│ │ │ ├── mf.svg
│ │ │ ├── mg.svg
│ │ │ ├── mh.svg
│ │ │ ├── mk.svg
│ │ │ ├── ml.svg
│ │ │ ├── mm.svg
│ │ │ ├── mn.svg
│ │ │ ├── mo.svg
│ │ │ ├── mp.svg
│ │ │ ├── mq.svg
│ │ │ ├── mr.svg
│ │ │ ├── ms.svg
│ │ │ ├── mt.svg
│ │ │ ├── mu.svg
│ │ │ ├── mv.svg
│ │ │ ├── mw.svg
│ │ │ ├── mx.svg
│ │ │ ├── my.svg
│ │ │ ├── mz.svg
│ │ │ ├── na.svg
│ │ │ ├── nc.svg
│ │ │ ├── ne.svg
│ │ │ ├── nf.svg
│ │ │ ├── ng.svg
│ │ │ ├── ni.svg
│ │ │ ├── nl.svg
│ │ │ ├── no.svg
│ │ │ ├── np.svg
│ │ │ ├── nr.svg
│ │ │ ├── nu.svg
│ │ │ ├── nz.svg
│ │ │ ├── om.svg
│ │ │ ├── pa.svg
│ │ │ ├── pe.svg
│ │ │ ├── pf.svg
│ │ │ ├── pg.svg
│ │ │ ├── ph.svg
│ │ │ ├── pk.svg
│ │ │ ├── pl.svg
│ │ │ ├── pm.svg
│ │ │ ├── pn.svg
│ │ │ ├── pr.svg
│ │ │ ├── ps.svg
│ │ │ ├── pt.svg
│ │ │ ├── pw.svg
│ │ │ ├── py.svg
│ │ │ ├── qa.svg
│ │ │ ├── re.svg
│ │ │ ├── ro.svg
│ │ │ ├── rs.svg
│ │ │ ├── ru.svg
│ │ │ ├── rw.svg
│ │ │ ├── sa.svg
│ │ │ ├── sb.svg
│ │ │ ├── sc.svg
│ │ │ ├── sd.svg
│ │ │ ├── se.svg
│ │ │ ├── sg.svg
│ │ │ ├── sh.svg
│ │ │ ├── si.svg
│ │ │ ├── sj.svg
│ │ │ ├── sk.svg
│ │ │ ├── sl.svg
│ │ │ ├── sm.svg
│ │ │ ├── sn.svg
│ │ │ ├── so.svg
│ │ │ ├── sr.svg
│ │ │ ├── ss.svg
│ │ │ ├── st.svg
│ │ │ ├── sv.svg
│ │ │ ├── sx.svg
│ │ │ ├── sy.svg
│ │ │ ├── sz.svg
│ │ │ ├── tc.svg
│ │ │ ├── td.svg
│ │ │ ├── tf.svg
│ │ │ ├── tg.svg
│ │ │ ├── th.svg
│ │ │ ├── tj.svg
│ │ │ ├── tk.svg
│ │ │ ├── tl.svg
│ │ │ ├── tm.svg
│ │ │ ├── tn.svg
│ │ │ ├── to.svg
│ │ │ ├── tr.svg
│ │ │ ├── tt.svg
│ │ │ ├── tv.svg
│ │ │ ├── tw.svg
│ │ │ ├── tz.svg
│ │ │ ├── ua.svg
│ │ │ ├── ug.svg
│ │ │ ├── um.svg
│ │ │ ├── us.svg
│ │ │ ├── uy.svg
│ │ │ ├── uz.svg
│ │ │ ├── va.svg
│ │ │ ├── vc.svg
│ │ │ ├── ve.svg
│ │ │ ├── vg.svg
│ │ │ ├── vi.svg
│ │ │ ├── vn.svg
│ │ │ ├── vu.svg
│ │ │ ├── wf.svg
│ │ │ ├── ws.svg
│ │ │ ├── ye.svg
│ │ │ ├── yt.svg
│ │ │ ├── za.svg
│ │ │ ├── zm.svg
│ │ │ └── zw.svg
│ │ │ └── 4x3
│ │ │ ├── ad.svg
│ │ │ ├── ae.svg
│ │ │ ├── af.svg
│ │ │ ├── ag.svg
│ │ │ ├── ai.svg
│ │ │ ├── al.svg
│ │ │ ├── am.svg
│ │ │ ├── ao.svg
│ │ │ ├── aq.svg
│ │ │ ├── ar.svg
│ │ │ ├── as.svg
│ │ │ ├── at.svg
│ │ │ ├── au.svg
│ │ │ ├── aw.svg
│ │ │ ├── ax.svg
│ │ │ ├── az.svg
│ │ │ ├── ba.svg
│ │ │ ├── bb.svg
│ │ │ ├── bd.svg
│ │ │ ├── be.svg
│ │ │ ├── bf.svg
│ │ │ ├── bg.svg
│ │ │ ├── bh.svg
│ │ │ ├── bi.svg
│ │ │ ├── bj.svg
│ │ │ ├── bl.svg
│ │ │ ├── bm.svg
│ │ │ ├── bn.svg
│ │ │ ├── bo.svg
│ │ │ ├── bq.svg
│ │ │ ├── br.svg
│ │ │ ├── bs.svg
│ │ │ ├── bt.svg
│ │ │ ├── bv.svg
│ │ │ ├── bw.svg
│ │ │ ├── by.svg
│ │ │ ├── bz.svg
│ │ │ ├── ca.svg
│ │ │ ├── cc.svg
│ │ │ ├── cd.svg
│ │ │ ├── cf.svg
│ │ │ ├── cg.svg
│ │ │ ├── ch.svg
│ │ │ ├── ci.svg
│ │ │ ├── ck.svg
│ │ │ ├── cl.svg
│ │ │ ├── cm.svg
│ │ │ ├── cn.svg
│ │ │ ├── co.svg
│ │ │ ├── cr.svg
│ │ │ ├── cu.svg
│ │ │ ├── cv.svg
│ │ │ ├── cw.svg
│ │ │ ├── cx.svg
│ │ │ ├── cy.svg
│ │ │ ├── cz.svg
│ │ │ ├── de.svg
│ │ │ ├── dj.svg
│ │ │ ├── dk.svg
│ │ │ ├── dm.svg
│ │ │ ├── do.svg
│ │ │ ├── dz.svg
│ │ │ ├── ec.svg
│ │ │ ├── ee.svg
│ │ │ ├── eg.svg
│ │ │ ├── eh.svg
│ │ │ ├── er.svg
│ │ │ ├── es.svg
│ │ │ ├── et.svg
│ │ │ ├── fi.svg
│ │ │ ├── fj.svg
│ │ │ ├── fk.svg
│ │ │ ├── fm.svg
│ │ │ ├── fo.svg
│ │ │ ├── fr.svg
│ │ │ ├── ga.svg
│ │ │ ├── gb.svg
│ │ │ ├── gd.svg
│ │ │ ├── ge.svg
│ │ │ ├── gf.svg
│ │ │ ├── gg.svg
│ │ │ ├── gh.svg
│ │ │ ├── gi.svg
│ │ │ ├── gl.svg
│ │ │ ├── gm.svg
│ │ │ ├── gn.svg
│ │ │ ├── gp.svg
│ │ │ ├── gq.svg
│ │ │ ├── gr.svg
│ │ │ ├── gs.svg
│ │ │ ├── gt.svg
│ │ │ ├── gu.svg
│ │ │ ├── gw.svg
│ │ │ ├── gy.svg
│ │ │ ├── hk.svg
│ │ │ ├── hm.svg
│ │ │ ├── hn.svg
│ │ │ ├── hr.svg
│ │ │ ├── ht.svg
│ │ │ ├── hu.svg
│ │ │ ├── id.svg
│ │ │ ├── ie.svg
│ │ │ ├── il.svg
│ │ │ ├── im.svg
│ │ │ ├── in.svg
│ │ │ ├── io.svg
│ │ │ ├── iq.svg
│ │ │ ├── ir.svg
│ │ │ ├── is.svg
│ │ │ ├── it.svg
│ │ │ ├── je.svg
│ │ │ ├── jm.svg
│ │ │ ├── jo.svg
│ │ │ ├── jp.svg
│ │ │ ├── ke.svg
│ │ │ ├── kg.svg
│ │ │ ├── kh.svg
│ │ │ ├── ki.svg
│ │ │ ├── km.svg
│ │ │ ├── kn.svg
│ │ │ ├── kp.svg
│ │ │ ├── kr.svg
│ │ │ ├── kw.svg
│ │ │ ├── ky.svg
│ │ │ ├── kz.svg
│ │ │ ├── la.svg
│ │ │ ├── lb.svg
│ │ │ ├── lc.svg
│ │ │ ├── li.svg
│ │ │ ├── lk.svg
│ │ │ ├── lr.svg
│ │ │ ├── ls.svg
│ │ │ ├── lt.svg
│ │ │ ├── lu.svg
│ │ │ ├── lv.svg
│ │ │ ├── ly.svg
│ │ │ ├── ma.svg
│ │ │ ├── mc.svg
│ │ │ ├── md.svg
│ │ │ ├── me.svg
│ │ │ ├── mf.svg
│ │ │ ├── mg.svg
│ │ │ ├── mh.svg
│ │ │ ├── mk.svg
│ │ │ ├── ml.svg
│ │ │ ├── mm.svg
│ │ │ ├── mn.svg
│ │ │ ├── mo.svg
│ │ │ ├── mp.svg
│ │ │ ├── mq.svg
│ │ │ ├── mr.svg
│ │ │ ├── ms.svg
│ │ │ ├── mt.svg
│ │ │ ├── mu.svg
│ │ │ ├── mv.svg
│ │ │ ├── mw.svg
│ │ │ ├── mx.svg
│ │ │ ├── my.svg
│ │ │ ├── mz.svg
│ │ │ ├── na.svg
│ │ │ ├── nc.svg
│ │ │ ├── ne.svg
│ │ │ ├── nf.svg
│ │ │ ├── ng.svg
│ │ │ ├── ni.svg
│ │ │ ├── nl.svg
│ │ │ ├── no.svg
│ │ │ ├── np.svg
│ │ │ ├── nr.svg
│ │ │ ├── nu.svg
│ │ │ ├── nz.svg
│ │ │ ├── om.svg
│ │ │ ├── pa.svg
│ │ │ ├── pe.svg
│ │ │ ├── pf.svg
│ │ │ ├── pg.svg
│ │ │ ├── ph.svg
│ │ │ ├── pk.svg
│ │ │ ├── pl.svg
│ │ │ ├── pm.svg
│ │ │ ├── pn.svg
│ │ │ ├── pr.svg
│ │ │ ├── ps.svg
│ │ │ ├── pt.svg
│ │ │ ├── pw.svg
│ │ │ ├── py.svg
│ │ │ ├── qa.svg
│ │ │ ├── re.svg
│ │ │ ├── ro.svg
│ │ │ ├── rs.svg
│ │ │ ├── ru.svg
│ │ │ ├── rw.svg
│ │ │ ├── sa.svg
│ │ │ ├── sb.svg
│ │ │ ├── sc.svg
│ │ │ ├── sd.svg
│ │ │ ├── se.svg
│ │ │ ├── sg.svg
│ │ │ ├── sh.svg
│ │ │ ├── si.svg
│ │ │ ├── sj.svg
│ │ │ ├── sk.svg
│ │ │ ├── sl.svg
│ │ │ ├── sm.svg
│ │ │ ├── sn.svg
│ │ │ ├── so.svg
│ │ │ ├── sr.svg
│ │ │ ├── ss.svg
│ │ │ ├── st.svg
│ │ │ ├── sv.svg
│ │ │ ├── sx.svg
│ │ │ ├── sy.svg
│ │ │ ├── sz.svg
│ │ │ ├── tc.svg
│ │ │ ├── td.svg
│ │ │ ├── tf.svg
│ │ │ ├── tg.svg
│ │ │ ├── th.svg
│ │ │ ├── tj.svg
│ │ │ ├── tk.svg
│ │ │ ├── tl.svg
│ │ │ ├── tm.svg
│ │ │ ├── tn.svg
│ │ │ ├── to.svg
│ │ │ ├── tr.svg
│ │ │ ├── tt.svg
│ │ │ ├── tv.svg
│ │ │ ├── tw.svg
│ │ │ ├── tz.svg
│ │ │ ├── ua.svg
│ │ │ ├── ug.svg
│ │ │ ├── um.svg
│ │ │ ├── us.svg
│ │ │ ├── uy.svg
│ │ │ ├── uz.svg
│ │ │ ├── va.svg
│ │ │ ├── vc.svg
│ │ │ ├── ve.svg
│ │ │ ├── vg.svg
│ │ │ ├── vi.svg
│ │ │ ├── vn.svg
│ │ │ ├── vu.svg
│ │ │ ├── wf.svg
│ │ │ ├── ws.svg
│ │ │ ├── ye.svg
│ │ │ ├── yt.svg
│ │ │ ├── za.svg
│ │ │ ├── zm.svg
│ │ │ └── zw.svg
│ │ └── problem_stats
│ │ ├── jstree
│ │ ├── jstree.js
│ │ ├── jstree.min.js
│ │ └── themes
│ │ │ └── proton
│ │ │ ├── 30px.png
│ │ │ ├── 32px.png
│ │ │ ├── fonts
│ │ │ └── titillium
│ │ │ │ ├── titilliumweb-bold-webfont.eot
│ │ │ │ ├── titilliumweb-bold-webfont.svg
│ │ │ │ ├── titilliumweb-bold-webfont.ttf
│ │ │ │ ├── titilliumweb-bold-webfont.woff
│ │ │ │ ├── titilliumweb-extralight-webfont.eot
│ │ │ │ ├── titilliumweb-extralight-webfont.svg
│ │ │ │ ├── titilliumweb-extralight-webfont.ttf
│ │ │ │ ├── titilliumweb-extralight-webfont.woff
│ │ │ │ ├── titilliumweb-regular-webfont.eot
│ │ │ │ ├── titilliumweb-regular-webfont.svg
│ │ │ │ ├── titilliumweb-regular-webfont.ttf
│ │ │ │ └── titilliumweb-regular-webfont.woff
│ │ │ ├── style.css
│ │ │ ├── style.min.css
│ │ │ └── throbber.gif
│ │ └── utils.js
├── stats.py
├── templates
│ ├── course_dashboard
│ │ ├── base.html
│ │ ├── base_course.html
│ │ ├── base_global.html
│ │ ├── certificate-stats.html
│ │ ├── enrollment-stats-content.html
│ │ ├── enrollment-stats-global.html
│ │ ├── enrollment-stats.html
│ │ ├── forum-activity.html
│ │ ├── graph.html
│ │ ├── reports_manager
│ │ │ └── dashboard.html
│ │ ├── student-map-content.html
│ │ ├── student-map-footer.html
│ │ ├── student-map-global.html
│ │ ├── student-map.html
│ │ └── wiki-activity.html
│ └── problem_stats
│ │ ├── base.html
│ │ ├── choice_question.html
│ │ ├── index.html
│ │ ├── no_answers.html
│ │ ├── nothandled.html
│ │ └── single_choice_question.html
├── tests
│ ├── __init__.py
│ ├── base.py
│ ├── test_global_views.py
│ ├── test_stats.py
│ ├── test_views.py
│ └── test_wiki.py
├── urls.py
├── urls_global.py
└── views.py
├── course_pages
├── __init__.py
├── locale
│ └── fr
│ │ └── LC_MESSAGES
│ │ ├── django.mo
│ │ ├── django.po
│ │ ├── djangojs.mo
│ │ └── djangojs.po
├── models.py
├── templates
│ └── course_pages
│ │ ├── course-block
│ │ ├── big.html
│ │ ├── footer.html
│ │ ├── small.html
│ │ └── start-end-date.html
│ │ ├── feed
│ │ └── feed.html
│ │ ├── index.html
│ │ └── js
│ │ ├── criterion-value.underscore
│ │ ├── filter.underscore
│ │ └── small-course-block.underscore
├── tests
│ ├── __init__.py
│ ├── test_feed.py
│ └── test_pages.py
├── urls.py
└── views.py
├── courses
├── __init__.py
├── admin.py
├── choices.py
├── locale
│ └── fr
│ │ └── LC_MESSAGES
│ │ ├── django.mo
│ │ └── django.po
├── management
│ ├── __init__.py
│ └── commands
│ │ ├── __init__.py
│ │ └── update_courses.py
├── managers.py
├── migrations
│ ├── 0001_initial.py
│ ├── 0002_is_visible_deprecated.py
│ ├── 0003_default_value_to_featured.py
│ ├── 0004_auto_20161011_1739.py
│ ├── 0005_add_show_about_page_field.py
│ ├── 0006_default_to_false_for_show_in_catalog.py
│ ├── 0007_auto_20190403_1113.py
│ ├── 0008_auto_20191016_0452.py
│ └── __init__.py
├── models.py
├── search_indexes.py
├── settings.py
├── signals.py
├── static
│ └── courses
│ │ └── css
│ │ └── course_list_view.css
├── tasks.py
├── templates
│ └── search
│ │ └── indexes
│ │ └── courses
│ │ └── course_text.txt
├── tests
│ ├── __init__.py
│ ├── factories.py
│ ├── test_SQL_denormalization.py
│ ├── test_managers.py
│ └── test_models.py
└── utils.py
├── courses_api
├── __init__.py
├── api.py
├── filters.py
├── serializers.py
├── tests
│ ├── __init__.py
│ ├── test_course_api.py
│ └── test_course_subject_api.py
└── urls.py
├── forum_contributors
├── __init__.py
├── urls.py
└── views.py
├── fun
├── __init__.py
├── cms
│ ├── __init__.py
│ ├── tests
│ │ ├── __init__.py
│ │ └── test_videoupload.py
│ ├── urls.py
│ ├── urls_videoupload.py
│ ├── urls_youtube.py
│ ├── utils
│ │ ├── __init__.py
│ │ └── views.py
│ └── views
│ │ ├── __init__.py
│ │ ├── videoupload.py
│ │ └── youtube.py
├── common_urls.py
├── context_processor.py
├── envs
│ ├── __init__.py
│ ├── cms
│ │ ├── __init__.py
│ │ ├── common.py
│ │ ├── dev.py
│ │ └── unittests.py
│ ├── common.py
│ ├── dev.py
│ ├── lms
│ │ ├── __init__.py
│ │ ├── common.py
│ │ ├── dev.py
│ │ ├── dev_with_worker.py
│ │ ├── microsite
│ │ │ ├── __init__.py
│ │ │ ├── common.py
│ │ │ └── dev.py
│ │ └── unittests.py
│ └── test.py
├── lms
│ ├── __init__.py
│ ├── urls.py
│ └── views.py
├── locale
│ ├── babel-django.cfg
│ ├── babel-djangojs.cfg
│ ├── de
│ │ └── LC_MESSAGES
│ │ │ ├── django.mo
│ │ │ ├── django.po
│ │ │ ├── djangojs.mo
│ │ │ └── djangojs.po
│ └── fr
│ │ └── LC_MESSAGES
│ │ ├── django.mo
│ │ ├── django.po
│ │ ├── djangojs.mo
│ │ └── djangojs.po
├── management
│ ├── __init__.py
│ └── commands
│ │ ├── __init__.py
│ │ ├── dump_moocs_registrations.py
│ │ ├── enroll_all_students.py
│ │ ├── export_course_anonymized_demographics.py
│ │ ├── export_data_user.py
│ │ ├── generate_fun_verified_certificates.py
│ │ ├── generate_fun_verified_certificates_for_student.py
│ │ ├── generate_oa_data.py
│ │ ├── get_quizz_result.py
│ │ ├── makemessages_fun.py
│ │ ├── remove_wiki_write_permissions.py
│ │ ├── run-script.py
│ │ ├── tests
│ │ ├── __init__.py
│ │ ├── test_register_all_students.py
│ │ └── test_unregister_students.py
│ │ └── unregister_students.py
├── middleware
│ ├── __init__.py
│ ├── enforce_legal_acceptance.py
│ └── oauth2_step.py
├── shared.py
├── smtp
│ ├── __init__.py
│ ├── backend.py
│ └── tests.py
├── static
│ ├── bootstrap
│ │ ├── css
│ │ │ ├── bootstrap-theme.css
│ │ │ ├── bootstrap-theme.css.map
│ │ │ ├── bootstrap-theme.min.css
│ │ │ ├── bootstrap.css
│ │ │ ├── bootstrap.css.map
│ │ │ └── bootstrap.min.css
│ │ ├── fonts
│ │ │ ├── glyphicons-halflings-regular.eot
│ │ │ ├── glyphicons-halflings-regular.svg
│ │ │ ├── glyphicons-halflings-regular.ttf
│ │ │ └── glyphicons-halflings-regular.woff
│ │ └── js
│ │ │ ├── bootstrap.js
│ │ │ ├── bootstrap.min.js
│ │ │ └── npm.js
│ ├── bulk_email
│ │ └── images
│ │ │ ├── facebook.png
│ │ │ ├── logo-fun.png
│ │ │ ├── logo-funmooc.png
│ │ │ └── twitter.png
│ ├── ckeditor
│ │ └── ckeditor-init.js
│ ├── datatables
│ │ ├── css
│ │ │ └── jquery.dataTables.min.css
│ │ ├── images
│ │ │ ├── back_disabled.png
│ │ │ ├── back_enabled.png
│ │ │ ├── back_enabled_hover.png
│ │ │ ├── forward_disabled.png
│ │ │ ├── forward_enabled.png
│ │ │ ├── forward_enabled_hover.png
│ │ │ ├── sort_asc.png
│ │ │ ├── sort_asc_disabled.png
│ │ │ ├── sort_both.png
│ │ │ ├── sort_desc.png
│ │ │ └── sort_desc_disabled.png
│ │ └── js
│ │ │ ├── jquery.dataTables.min.js
│ │ │ └── moment.min.js
│ └── fun
│ │ ├── css
│ │ ├── cookie-banner.css
│ │ └── sandbox-cms.css
│ │ ├── images
│ │ ├── edx-studio-logo-sandbox.png
│ │ ├── favicon.ico
│ │ └── spinner.gif
│ │ └── js
│ │ ├── cookie-banner.js
│ │ ├── vendor
│ │ ├── jquery-1.11.1.min.js
│ │ ├── jquery.flot.pie.js
│ │ ├── jquery.flot.time.js
│ │ └── videojs
│ │ │ ├── VERSION
│ │ │ ├── demo.captions.vtt
│ │ │ ├── demo.html
│ │ │ ├── font
│ │ │ ├── vjs.eot
│ │ │ ├── vjs.svg
│ │ │ ├── vjs.ttf
│ │ │ └── vjs.woff
│ │ │ ├── lang
│ │ │ ├── ar.js
│ │ │ ├── bg.js
│ │ │ ├── ca.js
│ │ │ ├── cs.js
│ │ │ ├── de.js
│ │ │ ├── es.js
│ │ │ ├── fr.js
│ │ │ ├── hu.js
│ │ │ ├── it.js
│ │ │ ├── ja.js
│ │ │ ├── ko.js
│ │ │ ├── nl.js
│ │ │ ├── pt-BR.js
│ │ │ ├── ru.js
│ │ │ ├── tr.js
│ │ │ ├── uk.js
│ │ │ ├── vi.js
│ │ │ ├── zh-CN.js
│ │ │ └── zh-TW.js
│ │ │ ├── video-fun.dev.js
│ │ │ ├── video-fun.js
│ │ │ ├── video-js.css
│ │ │ ├── video-js.less
│ │ │ ├── video-js.min.css
│ │ │ ├── video-js.swf
│ │ │ ├── video.dev.js
│ │ │ ├── video.js
│ │ │ ├── video.novtt.dev.js
│ │ │ └── video.novtt.js
│ │ └── videoplayer-fun.js
├── tasks.py
├── templates
│ ├── cms
│ │ └── videoupload
│ │ │ ├── deactivated.html
│ │ │ ├── index.html
│ │ │ └── js
│ │ │ ├── list.underscore
│ │ │ ├── modal-button.underscore
│ │ │ ├── parameters-subtitle.underscore
│ │ │ ├── parameters-thumbnail.underscore
│ │ │ ├── parameters.underscore
│ │ │ ├── video.underscore
│ │ │ └── videoupload.js
│ └── fun
│ │ └── emails
│ │ ├── base_email.html
│ │ └── stats_email.html
├── tests
│ ├── __init__.py
│ ├── test_remove_wiki_write_permissions.py
│ ├── test_shared.py
│ ├── test_utils.py
│ └── utils.py
└── utils
│ ├── __init__.py
│ ├── context.py
│ ├── countries.py
│ ├── export_data.py
│ ├── funwiki.py
│ ├── html.py
│ ├── i18n.py
│ ├── mako.py
│ ├── managers.py
│ ├── mongo.py
│ ├── tests
│ ├── __init__.py
│ ├── test_context.py
│ ├── test_countries.py
│ └── test_funwiki.py
│ └── views.py
├── fun_api
├── __init__.py
├── admin.py
├── locale
│ └── fr
│ │ └── LC_MESSAGES
│ │ ├── django.mo
│ │ └── django.po
├── models.py
├── serializers.py
├── tests
│ ├── __init__.py
│ └── tests_auth.py
├── urls.py
└── views.py
├── fun_certificates
├── Arial.ttf
├── __init__.py
├── generator.py
├── locale
│ └── fr
│ │ └── LC_MESSAGES
│ │ ├── django.mo
│ │ └── django.po
├── static
│ └── fun_certificates
│ │ └── images
│ │ ├── certificat.png
│ │ ├── contours.jpg
│ │ ├── contours.png
│ │ ├── logo-FUN-certif.png
│ │ ├── palmes.png
│ │ └── tampon-fun.png
├── templates
│ └── certificates
│ │ ├── _accomplishment-rendering.html
│ │ └── accomplishment-base.html
├── tests
│ ├── __init__.py
│ ├── helpers.py
│ └── test_certificates.py
├── urls.py
├── utils.py
└── views.py
├── fun_instructor
├── __init__.py
├── instructor_task_api
│ ├── __init__.py
│ ├── submit_tasks.py
│ └── tests.py
├── tasks.py
├── urls.py
└── views.py
├── funsite
├── __init__.py
├── locale
│ └── fr
│ │ └── LC_MESSAGES
│ │ ├── django.mo
│ │ └── django.po
├── static
│ └── funsite
│ │ ├── arg.js
│ │ ├── .bower.json
│ │ ├── LICENSE.md
│ │ ├── README.md
│ │ ├── arg.js.nuspec
│ │ ├── bower.json
│ │ ├── dist
│ │ │ ├── arg-1.2.js
│ │ │ ├── arg-1.2.min.js
│ │ │ ├── arg-1.3.js
│ │ │ └── arg-1.3.min.js
│ │ ├── plugins
│ │ │ └── argjs.jquery.js
│ │ └── src
│ │ │ └── arg.js
│ │ ├── bootstrap
│ │ ├── config.json
│ │ ├── css
│ │ │ ├── bootstrap-theme.css
│ │ │ ├── bootstrap-theme.min.css
│ │ │ ├── bootstrap.css
│ │ │ └── bootstrap.min.css
│ │ ├── fonts
│ │ │ ├── glyphicons-halflings-regular.eot
│ │ │ ├── glyphicons-halflings-regular.svg
│ │ │ ├── glyphicons-halflings-regular.ttf
│ │ │ ├── glyphicons-halflings-regular.woff
│ │ │ └── glyphicons-halflings-regular.woff2
│ │ └── js
│ │ │ ├── bootstrap.js
│ │ │ └── bootstrap.min.js
│ │ ├── css
│ │ ├── footer.css
│ │ ├── fun.css
│ │ └── header.css
│ │ ├── fonts
│ │ ├── Raleway-Light.ttf
│ │ ├── Raleway-Regular.ttf
│ │ └── Raleway-SemiBold.ttf
│ │ ├── images
│ │ ├── homepage1280.jpg
│ │ ├── homepage1900.jpg
│ │ ├── homepage2495.jpg
│ │ ├── homepage768.jpg
│ │ ├── icones
│ │ │ ├── accessibility-red.png
│ │ │ ├── bubble-red.png
│ │ │ ├── by-nc-nd.eu.png
│ │ │ ├── by-nc-sa.eu.png
│ │ │ ├── by-nc.eu.png
│ │ │ ├── calendar-red.png
│ │ │ ├── calendar.png
│ │ │ ├── clock-red.png
│ │ │ ├── diploma-red.png
│ │ │ ├── english-flag.png
│ │ │ ├── exclamation-red.png
│ │ │ ├── filter-checkbox-checked.png
│ │ │ ├── filter-checkbox.png
│ │ │ ├── folder-red.png
│ │ │ ├── french-flag.png
│ │ │ ├── german-flag.png
│ │ │ ├── letter-red.png
│ │ │ ├── link-red.png
│ │ │ ├── login-email.png
│ │ │ ├── login-password.png
│ │ │ ├── register-hover.png
│ │ │ ├── register.png
│ │ │ ├── sandwich.png
│ │ │ ├── search.png
│ │ │ ├── small-blog.png
│ │ │ ├── small-facebook.png
│ │ │ ├── small-gplus.png
│ │ │ ├── small-linkedin.png
│ │ │ ├── small-tumblr.png
│ │ │ ├── small-twitter.png
│ │ │ ├── social-networks-hover.png
│ │ │ ├── social-networks.png
│ │ │ ├── spanish-flag.png
│ │ │ ├── star-red.png
│ │ │ ├── user.png
│ │ │ ├── verified-course.png
│ │ │ ├── verified-course60.png
│ │ │ ├── video-play-button.png
│ │ │ └── video-play-button2.png
│ │ ├── logos
│ │ │ ├── cines.jpg
│ │ │ ├── facebook32.png
│ │ │ ├── fun-fr.svg
│ │ │ ├── fun-white-fr.svg
│ │ │ ├── fun61-sandbox.png
│ │ │ ├── funmooc-color.svg
│ │ │ ├── funmooc173.png
│ │ │ ├── funmooc45.png
│ │ │ ├── funmoocattest.png
│ │ │ ├── funmoocfp.png
│ │ │ ├── inria.jpg
│ │ │ ├── menes.png
│ │ │ ├── mesr.png
│ │ │ ├── powered-by-openedx.png
│ │ │ └── twitter32.png
│ │ ├── news-background.jpg
│ │ └── proctoru
│ │ │ ├── image001.png
│ │ │ ├── image002.png
│ │ │ ├── image003.png
│ │ │ ├── image004.png
│ │ │ ├── image005.png
│ │ │ ├── image006.jpg
│ │ │ ├── image007.jpg
│ │ │ ├── image008.jpg
│ │ │ ├── image009.png
│ │ │ ├── image010.png
│ │ │ ├── image011.png
│ │ │ ├── image012.png
│ │ │ ├── image013.png
│ │ │ ├── image014.jpg
│ │ │ ├── image015.jpg
│ │ │ ├── image016.jpg
│ │ │ └── image017.png
│ │ ├── jquery
│ │ ├── .bower.json
│ │ ├── MIT-LICENSE.txt
│ │ ├── bower.json
│ │ ├── dist
│ │ │ ├── jquery.js
│ │ │ ├── jquery.min.js
│ │ │ └── jquery.min.map
│ │ └── src
│ │ │ ├── ajax.js
│ │ │ ├── ajax
│ │ │ ├── jsonp.js
│ │ │ ├── load.js
│ │ │ ├── parseJSON.js
│ │ │ ├── parseXML.js
│ │ │ ├── script.js
│ │ │ ├── var
│ │ │ │ ├── nonce.js
│ │ │ │ └── rquery.js
│ │ │ └── xhr.js
│ │ │ ├── attributes.js
│ │ │ ├── attributes
│ │ │ ├── attr.js
│ │ │ ├── classes.js
│ │ │ ├── prop.js
│ │ │ ├── support.js
│ │ │ └── val.js
│ │ │ ├── callbacks.js
│ │ │ ├── core.js
│ │ │ ├── core
│ │ │ ├── access.js
│ │ │ ├── init.js
│ │ │ ├── parseHTML.js
│ │ │ ├── ready.js
│ │ │ └── var
│ │ │ │ └── rsingleTag.js
│ │ │ ├── css.js
│ │ │ ├── css
│ │ │ ├── addGetHookIf.js
│ │ │ ├── curCSS.js
│ │ │ ├── defaultDisplay.js
│ │ │ ├── hiddenVisibleSelectors.js
│ │ │ ├── support.js
│ │ │ ├── swap.js
│ │ │ └── var
│ │ │ │ ├── cssExpand.js
│ │ │ │ ├── getStyles.js
│ │ │ │ ├── isHidden.js
│ │ │ │ ├── rmargin.js
│ │ │ │ └── rnumnonpx.js
│ │ │ ├── data.js
│ │ │ ├── data
│ │ │ ├── Data.js
│ │ │ ├── accepts.js
│ │ │ └── var
│ │ │ │ ├── data_priv.js
│ │ │ │ └── data_user.js
│ │ │ ├── deferred.js
│ │ │ ├── deprecated.js
│ │ │ ├── dimensions.js
│ │ │ ├── effects.js
│ │ │ ├── effects
│ │ │ ├── Tween.js
│ │ │ └── animatedSelector.js
│ │ │ ├── event.js
│ │ │ ├── event
│ │ │ ├── ajax.js
│ │ │ ├── alias.js
│ │ │ └── support.js
│ │ │ ├── exports
│ │ │ ├── amd.js
│ │ │ └── global.js
│ │ │ ├── intro.js
│ │ │ ├── jquery.js
│ │ │ ├── manipulation.js
│ │ │ ├── manipulation
│ │ │ ├── _evalUrl.js
│ │ │ ├── support.js
│ │ │ └── var
│ │ │ │ └── rcheckableType.js
│ │ │ ├── offset.js
│ │ │ ├── outro.js
│ │ │ ├── queue.js
│ │ │ ├── queue
│ │ │ └── delay.js
│ │ │ ├── selector-native.js
│ │ │ ├── selector-sizzle.js
│ │ │ ├── selector.js
│ │ │ ├── serialize.js
│ │ │ ├── sizzle
│ │ │ └── dist
│ │ │ │ ├── sizzle.js
│ │ │ │ ├── sizzle.min.js
│ │ │ │ └── sizzle.min.map
│ │ │ ├── traversing.js
│ │ │ ├── traversing
│ │ │ ├── findFilter.js
│ │ │ └── var
│ │ │ │ └── rneedsContext.js
│ │ │ ├── var
│ │ │ ├── arr.js
│ │ │ ├── class2type.js
│ │ │ ├── concat.js
│ │ │ ├── hasOwn.js
│ │ │ ├── indexOf.js
│ │ │ ├── pnum.js
│ │ │ ├── push.js
│ │ │ ├── rnotwhite.js
│ │ │ ├── slice.js
│ │ │ ├── strundefined.js
│ │ │ ├── support.js
│ │ │ └── toString.js
│ │ │ └── wrap.js
│ │ ├── js
│ │ ├── fun.js
│ │ └── header.js
│ │ └── owl.carousel
│ │ ├── assets
│ │ ├── owl.carousel.css
│ │ └── owl.video.play.png
│ │ ├── owl.carousel.js
│ │ └── owl.carousel.min.js
├── templates
│ ├── funsite
│ │ ├── parts
│ │ │ ├── base-fixed-width.html
│ │ │ ├── base-fluid.html
│ │ │ ├── base.html
│ │ │ ├── breadcrumbs.html
│ │ │ ├── footer.html
│ │ │ ├── forget-password-modal.html
│ │ │ ├── login-overlay.html
│ │ │ ├── menu.html
│ │ │ ├── sandwich-overlay.html
│ │ │ └── simple-content.html
│ │ └── static_templates
│ │ │ ├── about.html
│ │ │ ├── fun-address.html
│ │ │ ├── register_info.html
│ │ │ └── searchprovider.xml
│ └── lms
│ │ ├── courseware
│ │ └── course_about.html
│ │ ├── discussion
│ │ ├── _js_head_dependencies.html
│ │ └── post-user-display.underscore
│ │ ├── footer.html
│ │ ├── index.html
│ │ ├── login.html
│ │ ├── main.html
│ │ ├── navigation.html
│ │ ├── provider
│ │ └── authorize.html
│ │ ├── register.html
│ │ └── static_templates
│ │ ├── 404.html
│ │ └── server-error.html
├── tests
│ ├── __init__.py
│ ├── test_urls.py
│ ├── test_utils.py
│ └── test_views.py
├── urls.py
├── utils.py
└── views.py
├── grades_api
├── __init__.py
├── api.py
└── urls.py
├── mailing_list
├── __init__.py
├── locale
│ └── fr
│ │ └── LC_MESSAGES
│ │ ├── django.mo
│ │ └── django.po
├── templates
│ └── mailing_list
│ │ └── index.html
├── urls.py
└── views.py
├── newsfeed
├── __init__.py
├── admin.py
├── locale
│ └── fr
│ │ └── LC_MESSAGES
│ │ ├── django.mo
│ │ └── django.po
├── migrations
│ ├── 0001_initial.py
│ ├── 0002_auto_20161011_1724.py
│ └── __init__.py
├── models.py
├── templates
│ ├── admin
│ │ └── solo
│ │ │ ├── change_form.html
│ │ │ └── object_history.html
│ └── newsfeed
│ │ ├── article
│ │ ├── block.html
│ │ ├── detail.html
│ │ ├── list.html
│ │ └── pagination.html
│ │ ├── change_form.html
│ │ └── feed
│ │ └── feed.html
├── tests
│ ├── __init__.py
│ ├── factories.py
│ ├── test_feed.py
│ ├── test_microsites.py
│ ├── test_models.py
│ └── test_views.py
├── urls.py
├── views.py
└── views_ckeditor.py
├── payment
├── __init__.py
├── admin.py
├── locale
│ └── fr
│ │ └── LC_MESSAGES
│ │ ├── django.mo
│ │ └── django.po
├── migrations
│ ├── 0001_initial.py
│ ├── 0002_auto_20170615_1426.py
│ ├── 0003_auto_20180705_1154.py
│ ├── 0004_auto_20191016_0452.py
│ └── __init__.py
├── models.py
├── static
│ └── payment
│ │ └── css
│ │ └── order.css
├── templates
│ └── payment
│ │ ├── base-abstract.html
│ │ ├── base.html
│ │ ├── base_large.html
│ │ ├── cancel.html
│ │ ├── email
│ │ ├── base.html
│ │ ├── bill.html
│ │ ├── confirmation-email.html
│ │ └── confirmation-email.txt
│ │ ├── error.html
│ │ ├── list_orders.html
│ │ ├── order.html
│ │ ├── success.html
│ │ └── terms-and-conditions.html
├── tests
│ ├── __init__.py
│ ├── factories.py
│ ├── test_payment.py
│ └── test_terms.py
├── urls.py
├── utils.py
└── views.py
├── payment_api
├── __init__.py
├── models.py
├── serializers.py
├── urls.py
└── views.py
├── pylint.cfg
├── quality.py
├── requirements.txt
├── requirements
├── base.txt
├── dev.txt
├── ipython-xblock.txt
└── private.txt
├── scripts
├── correct_tracking_logs.py
├── entrypoint.sh
├── i18n_compare.py
├── manifest.sh
└── migrations.sh
├── setup.cfg
├── setup.py
├── teachers
├── __init__.py
├── admin.py
├── migrations
│ ├── 0001_initial.py
│ └── __init__.py
└── models.py
├── universities
├── __init__.py
├── admin.py
├── api.py
├── choices.py
├── ckeditor_settings.py
├── locale
│ └── fr
│ │ └── LC_MESSAGES
│ │ ├── django.mo
│ │ └── django.po
├── managers.py
├── migrations
│ ├── 0001_initial.py
│ ├── 0002_auto_20191016_0452.py
│ └── __init__.py
├── models.py
├── serializers.py
├── templates
│ └── universities
│ │ ├── detail.html
│ │ └── index.html
├── tests
│ ├── __init__.py
│ ├── factories.py
│ ├── test_api.py
│ └── test_views.py
├── urls.py
└── views.py
└── videoproviders
├── __init__.py
├── admin.py
├── api
├── __init__.py
├── base.py
├── videofront.py
└── youtube.py
├── forms.py
├── locale
└── fr
│ └── LC_MESSAGES
│ ├── django.mo
│ └── django.po
├── management
├── __init__.py
└── commands
│ ├── __init__.py
│ └── youtube-auth.py
├── migrations
├── 0001_initial.py
├── 0002_videouploaderdeactivationperiod_youtubeauth_youtubecoursesettings.py
├── 0003_explicitely_set_is_youtube_video_xblock_attribute.py
├── 0004_del_libcast.py
├── 0005_videofrontauth_videofrontcoursesettings.py
├── 0006_explicitely_set_is_youtube_video_xblock_attribute.py
└── __init__.py
├── models.py
├── patterns.py
├── subtitles.py
└── tests
├── __init__.py
├── fixtures
├── __init__.py
├── sub.fr.srt
├── sub.fr.vtt
├── videofront
│ ├── playlist_created.json
│ └── video_success.json
└── youtube
│ ├── playlist_items1.json
│ ├── video1.json
│ └── video1_in_progress.json
├── test_subtitles.py
├── test_videofront.py
└── test_youtube.py
/.gitignore:
--------------------------------------------------------------------------------
1 | # System-specific local files
2 | .DS_Store
3 | *.pyc
4 |
5 | # Editors
6 | .vscode
7 |
8 | # Packaging
9 | *.egg-info/
10 | build/
11 | dist/
12 |
13 | # Virtual environments
14 | venv/
15 | env/
16 | .env/
17 | pylintrc
18 | components/
19 | .vscode/
20 |
--------------------------------------------------------------------------------
/backoffice/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/backoffice/__init__.py
--------------------------------------------------------------------------------
/backoffice/certificate_manager/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/backoffice/certificate_manager/__init__.py
--------------------------------------------------------------------------------
/backoffice/certificate_manager/urls.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | from django.conf.urls import url, patterns
4 |
5 | urlpatterns = patterns('backoffice.certificate_manager.views',
6 | url(r'^dashboard$', 'certificate_dashboard', name='certificate-dashboard'),
7 | url(r'^generate_test$', 'generate_test_certificate', name='generate-test-certificate'),
8 | url(r'^generate$', 'generate_certificate', name='generate-certificates'),
9 | )
10 |
--------------------------------------------------------------------------------
/backoffice/locale/fr/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/backoffice/locale/fr/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/backoffice/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/backoffice/migrations/__init__.py
--------------------------------------------------------------------------------
/backoffice/models.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/backoffice/models.py
--------------------------------------------------------------------------------
/backoffice/ora2_submissions/__init__.py:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/backoffice/ora2_submissions/urls.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | from django.conf.urls import url, patterns
4 |
5 | urlpatterns = patterns('backoffice.ora2_submissions.views',
6 | url(r'^prepare/$', 'prepare', name='prepare'),
7 | url(r'^download/$', 'download', name='download'),
8 | url(r'^$', 'status', name='status'),
9 | )
10 |
--------------------------------------------------------------------------------
/backoffice/templates/backoffice/certificate-confirm-modal-dialog.html:
--------------------------------------------------------------------------------
1 | {% load i18n course %}
2 |
3 |
4 |
7 |
8 | {% trans "Please confirm that you really want to generate a certificate for course:" %}
9 |
{{ course.display_name_with_default }}
10 |
11 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/backoffice/templates/backoffice/modal_forms/ban_user.html:
--------------------------------------------------------------------------------
1 | {% extends 'backoffice/modal_forms/base_modal_form.html' %}
2 | {% load i18n %}
3 | {% block input-form%}
4 |
5 |
6 | {% endblock %}
7 |
8 | {% block modal-body %}
9 | {% if disabled %}{% trans "Confirm unban of user" %}{% else %}{% trans "Confirm ban of user" %}{% endif %}
10 | {% trans "Full name" context "user-full-name" %}: {{ userform.instance.profile.name }}
11 | {% trans "Username" %}: {{ userform.instance.username }}
12 |
13 |
14 |
15 | Le bannissement de l'utilisateur rendra son compte inutilisable et lui interdira de se connecter à la plate-forme et donc de recréer un nouveau compte.
16 | Toutefois en utilisant un autre navigateur ou autre ordinateur, il pourra recréer un compte.
17 |
18 |
19 |
20 |
21 |
22 | {% endblock %}
23 |
--------------------------------------------------------------------------------
/backoffice/templates/backoffice/modal_forms/change_grade.html:
--------------------------------------------------------------------------------
1 | {% extends 'backoffice/modal_forms/base_modal_form.html' %}
2 | {% load i18n %}
3 | {% block input-form %}
4 |
5 |
6 | {% endblock %}
7 |
8 | {% block modal-body %}
9 | {% trans "Enter new grade (range from 0 to 1):" %}
10 |
11 |
12 | {% endblock %}
13 |
14 | {% block modal-button %}
15 | {% trans "Confirm" %}
16 | {% trans "Confirm and regenerate" %}
17 | {% endblock %}
18 |
--------------------------------------------------------------------------------
/backoffice/templates/backoffice/modal_forms/change_mode.html:
--------------------------------------------------------------------------------
1 | {% extends 'backoffice/modal_forms/base_modal_form.html' %}
2 | {% load i18n %}
3 | {% block input-form %}
4 |
5 |
6 | {% endblock %}
7 |
8 | {% block modal-title %}{% trans "Change mode" %}{% endblock %}
9 | {% block modal-body %}
10 | {% trans "Select new mode for student enrollment to this course" %}
11 |
12 | Honor
13 | Verified
14 |
15 |
16 | {% endblock %}
17 |
18 | {% block modal-button %}
19 | {% trans "Confirm" %}
20 | {% endblock %}
21 |
--------------------------------------------------------------------------------
/backoffice/templates/backoffice/modal_forms/change_password.html:
--------------------------------------------------------------------------------
1 | {% extends 'backoffice/modal_forms/base_modal_form.html' %}
2 | {% load i18n %}
3 | {% block input-form%}
4 |
5 | {% endblock %}
6 | {% block modal-body %}
7 | {% trans "Enter new password" %}
8 |
9 |
10 | {% endblock %}
11 |
--------------------------------------------------------------------------------
/backoffice/templatetags/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/backoffice/templatetags/__init__.py
--------------------------------------------------------------------------------
/backoffice/templatetags/course.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | from django import template
4 |
5 | from courses.utils import get_about_section
6 | from openedx.core.lib.courses import course_image_url
7 |
8 | register = template.Library()
9 |
10 |
11 | @register.assignment_tag
12 | def course_infos(course):
13 | d = {
14 | 'course_image_url': course_image_url(course)
15 | }
16 | for section in ['title', 'university']:
17 | d[section] = get_about_section(course, section)
18 | return d
19 |
--------------------------------------------------------------------------------
/backoffice/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/backoffice/tests/__init__.py
--------------------------------------------------------------------------------
/backoffice/tests/factories.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | import factory
4 | from factory.django import DjangoModelFactory
5 |
6 | from student.models import UserSignupSource
7 | from student.tests.factories import UserFactory
8 |
9 |
10 | class MicrositeUserFactory(DjangoModelFactory):
11 | user = factory.SubFactory(UserFactory)
12 |
13 | class Meta(object):
14 | model = UserSignupSource
15 |
--------------------------------------------------------------------------------
/backoffice/views/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/backoffice/views/__init__.py
--------------------------------------------------------------------------------
/course_dashboard/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_dashboard/__init__.py
--------------------------------------------------------------------------------
/course_dashboard/locale/fr/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_dashboard/locale/fr/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/course_dashboard/problem_stats/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_dashboard/problem_stats/__init__.py
--------------------------------------------------------------------------------
/course_dashboard/problem_stats/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_dashboard/problem_stats/tests/__init__.py
--------------------------------------------------------------------------------
/course_dashboard/problem_stats/tests/sample_courses.py:
--------------------------------------------------------------------------------
1 | """
2 | Used to create course subtrees in ModuleStoreTestCase.create_test_course
3 | """
4 |
5 | from collections import namedtuple
6 |
7 | BlockInfo = namedtuple('BlockInfo', 'block_id, category, fields, sub_tree')
8 |
9 | problem_block_info_tree = [ # pylint: disable=invalid-name
10 | BlockInfo(
11 | 'chapter_x', 'chapter', {}, [
12 | BlockInfo(
13 | 'sequential_x1', 'sequential', {}, [
14 | BlockInfo(
15 | 'vertical_x1a', 'vertical', {}, [
16 | BlockInfo('89b2ed2a06ce4f9f8dcd26fee087b60a', 'problem', {}, []),
17 | ]
18 | )
19 | ]
20 | )
21 | ]
22 | ),
23 | ]
24 |
--------------------------------------------------------------------------------
/course_dashboard/problem_stats/urls.py:
--------------------------------------------------------------------------------
1 | from django.conf.urls import url, patterns
2 |
3 | urlpatterns = patterns('course_dashboard.problem_stats.views',
4 | url(r'^index/$', 'index', name='index'),
5 | url(r'^get_stats/(?P.*)$', 'get_stats', name='get-stats'),
6 | )
7 |
--------------------------------------------------------------------------------
/course_dashboard/reports_manager/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_dashboard/reports_manager/__init__.py
--------------------------------------------------------------------------------
/course_dashboard/reports_manager/tests/test_utils.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | from xmodule.modulestore.tests.factories import ItemFactory
4 |
5 | from course_dashboard.reports_manager import utils
6 | from course_dashboard.tests.base import BaseCourseDashboardTestCase
7 |
8 | class UtilsTestCase(BaseCourseDashboardTestCase):
9 | def test_build_answers_distribution_report_name(self):
10 | problem_name = u"Quizz trés fà cile."
11 | problem = ItemFactory(parent=self.course,
12 | category='problem',
13 | display_name=problem_name)
14 | report_name = utils.build_answers_distribution_report_name(problem)
15 | assert report_name
16 |
--------------------------------------------------------------------------------
/course_dashboard/reports_manager/urls.py:
--------------------------------------------------------------------------------
1 | from django.conf.urls import url, patterns
2 |
3 | urlpatterns = patterns('course_dashboard.reports_manager.views',
4 | url(r'^dashboard/$', 'dashboard', name='dashboard'),
5 | url(r'^generate/(?P.*)/$', 'generate', name='generate'),
6 | url(r'^download/(?P.+.csv)$', 'download', name='download'),
7 | )
8 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/am.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | image/svg+xml
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/at.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/bg.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/bl.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/bq.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | image/svg+xml
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/fr.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/gf.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/gp.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/ht.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/it.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/mc.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/mf.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/mq.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/nc.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/pl.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/pm.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/re.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/tf.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/ua.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/wf.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/ye.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/1x1/yt.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/4x3/am.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | image/svg+xml
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/4x3/bl.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/4x3/bq.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | image/svg+xml
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/4x3/cd.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | image/svg+xml
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/4x3/co.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/4x3/cr.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/4x3/fr.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/4x3/it.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/4x3/mc.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/4x3/mf.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/4x3/mq.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/4x3/nc.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/4x3/pl.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/4x3/pm.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/4x3/re.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/4x3/ua.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/4x3/wf.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/4x3/ye.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/flags/flags/4x3/yt.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | image/svg+xml
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/30px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/30px.png
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/32px.png
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/fonts/titillium/titilliumweb-bold-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/fonts/titillium/titilliumweb-bold-webfont.eot
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/fonts/titillium/titilliumweb-bold-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/fonts/titillium/titilliumweb-bold-webfont.ttf
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/fonts/titillium/titilliumweb-bold-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/fonts/titillium/titilliumweb-bold-webfont.woff
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/fonts/titillium/titilliumweb-extralight-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/fonts/titillium/titilliumweb-extralight-webfont.eot
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/fonts/titillium/titilliumweb-extralight-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/fonts/titillium/titilliumweb-extralight-webfont.ttf
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/fonts/titillium/titilliumweb-extralight-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/fonts/titillium/titilliumweb-extralight-webfont.woff
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/fonts/titillium/titilliumweb-regular-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/fonts/titillium/titilliumweb-regular-webfont.eot
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/fonts/titillium/titilliumweb-regular-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/fonts/titillium/titilliumweb-regular-webfont.ttf
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/fonts/titillium/titilliumweb-regular-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/fonts/titillium/titilliumweb-regular-webfont.woff
--------------------------------------------------------------------------------
/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/throbber.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_dashboard/static/course_dashboard/problem_stats/jstree/themes/proton/throbber.gif
--------------------------------------------------------------------------------
/course_dashboard/templates/course_dashboard/base_global.html:
--------------------------------------------------------------------------------
1 | ## mako
2 | <%inherit file="base.html" />
3 | <%! from django.utils.translation import ugettext as _ %>
4 | <%! from django.core.urlresolvers import reverse %>
5 |
6 | <%block name="navbar_header">
7 | ## TODO
8 | %block>
9 |
10 | <%block name="header">
11 | ${_("Platform statistics")}
12 | %block>
13 |
14 | <%block name="navigation">
15 |
19 | %block>
20 |
--------------------------------------------------------------------------------
/course_dashboard/templates/course_dashboard/enrollment-stats-global.html:
--------------------------------------------------------------------------------
1 | ## mako
2 | <%inherit file="base_global.html" />
3 | <%! from django.utils.translation import ugettext as _ %>
4 |
5 | <%block name="content">
6 | <%include file="enrollment-stats-content.html"/>
7 | %block>
8 |
9 | <%block name="extra_footer">
10 | <% figure_label=_("Enrollments per day") %>
11 | <%include file="graph.html"
12 | args="stats_per_timestamp=enrollments_per_timestamp,
13 | figure_id='enrollment-stats',
14 | figure_label=figure_label"
15 | />
16 | %block>
17 |
--------------------------------------------------------------------------------
/course_dashboard/templates/course_dashboard/enrollment-stats.html:
--------------------------------------------------------------------------------
1 | ## mako
2 | <%inherit file="base_course.html" />
3 | <%! from django.core.urlresolvers import reverse %>
4 | <%! from django.utils.translation import ugettext as _ %>
5 |
6 | <%block name="content">
7 | <%include file="enrollment-stats-content.html"/>
8 | %block>
9 |
10 | <%block name="extra_footer">
11 | <% figure_label=_("Enrollments per day") %>
12 | <%include file="graph.html"
13 | args="stats_per_timestamp=enrollments_per_timestamp,
14 | figure_id='enrollment-stats',
15 | figure_label=figure_label"
16 | />
17 | %block>
18 |
--------------------------------------------------------------------------------
/course_dashboard/templates/course_dashboard/student-map-global.html:
--------------------------------------------------------------------------------
1 | ## mako
2 | <%inherit file="base_global.html" />
3 |
4 | <%block name="content">
5 | <%include file="student-map-content.html"/>
6 | %block>
7 |
8 | <%block name="extra_footer">
9 | <%include file="student-map-footer.html"/>
10 | %block>
11 |
--------------------------------------------------------------------------------
/course_dashboard/templates/course_dashboard/student-map.html:
--------------------------------------------------------------------------------
1 | ## mako
2 | <%inherit file="base_course.html" />
3 |
4 | <%block name="content">
5 | <%include file="student-map-content.html"/>
6 | %block>
7 |
8 | <%block name="extra_footer">
9 | <%include file="student-map-footer.html"/>
10 | %block>
11 |
--------------------------------------------------------------------------------
/course_dashboard/templates/problem_stats/no_answers.html:
--------------------------------------------------------------------------------
1 | ## mako
2 | <%! from django.utils.translation import ugettext as _ %>
3 |
4 |
5 |
6 | % for element in title:
7 |
${element.text}
8 | % endfor
9 |
10 |
11 | ${_("No answers were found for this question.")}
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/course_dashboard/templates/problem_stats/nothandled.html:
--------------------------------------------------------------------------------
1 | ## mako
2 | <%! from django.utils.translation import ugettext as _ %>
3 | <%! from course_dashboard.problem_stats.utils import percentage %>
4 |
5 | <%inherit file="base.html" />
6 |
7 | <%block name="answers_distribution">
8 |
9 | ${ _("The answers distribution for problem {} is not handled yet.").format(question_id)}
10 |
11 | %block>
12 |
--------------------------------------------------------------------------------
/course_dashboard/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_dashboard/tests/__init__.py
--------------------------------------------------------------------------------
/course_dashboard/urls.py:
--------------------------------------------------------------------------------
1 | from django.conf.urls import url, patterns, include
2 |
3 | urlpatterns = patterns('course_dashboard.views',
4 | url(r'^enrollments/$', 'enrollment_stats', name='enrollment-stats'),
5 | url(r'^map/$', 'student_map', name='student-map'),
6 | url(r'^forum/$', 'forum_activity', name='forum-activity'),
7 | url(r'^problem_stats/', include('course_dashboard.problem_stats.urls',
8 | namespace='problem-stats')),
9 | url(r'^certificate_stats/', 'certificate_stats', name='certificate-stats'),
10 | url(r'^reports_manager/', include('course_dashboard.reports_manager.urls',
11 | namespace='reports-manager')),
12 | url(r'^wiki/$', 'wiki_activity', name='wiki-activity'),
13 | url(r'^$', 'enrollment_stats', name='home'),
14 | )
--------------------------------------------------------------------------------
/course_dashboard/urls_global.py:
--------------------------------------------------------------------------------
1 | from django.conf.urls import url, patterns
2 |
3 | urlpatterns = patterns('course_dashboard.views',
4 | url(r'^enrollments/$', 'global_enrollment_stats', name='enrollment-stats'),
5 | url(r'^map/$', 'global_student_map', name='student-map'),
6 | url(r'^$', 'global_enrollment_stats', name='home'),
7 | )
8 |
--------------------------------------------------------------------------------
/course_pages/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_pages/__init__.py
--------------------------------------------------------------------------------
/course_pages/locale/fr/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_pages/locale/fr/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/course_pages/locale/fr/LC_MESSAGES/djangojs.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_pages/locale/fr/LC_MESSAGES/djangojs.mo
--------------------------------------------------------------------------------
/course_pages/models.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_pages/models.py
--------------------------------------------------------------------------------
/course_pages/templates/course_pages/course-block/footer.html:
--------------------------------------------------------------------------------
1 | ## mako
2 | <%!
3 | from django.utils.translation import ugettext as _
4 | %>
5 |
6 |
7 | <%page args="course,type"/>
8 |
9 |
17 |
18 |
--------------------------------------------------------------------------------
/course_pages/templates/course_pages/js/criterion-value.underscore:
--------------------------------------------------------------------------------
1 | <%= title %>
2 | <%= count %>
3 |
--------------------------------------------------------------------------------
/course_pages/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/course_pages/tests/__init__.py
--------------------------------------------------------------------------------
/course_pages/urls.py:
--------------------------------------------------------------------------------
1 | from django.conf.urls import patterns, url
2 |
3 | from .views import courses_index, CoursesFeed
4 |
5 |
6 | urlpatterns = patterns('',
7 | url(r'^$', courses_index, name='index'),
8 | url(r'^#filter/subject/(?P.+)$', courses_index, name='filter'),
9 | url(r'^feed/$', CoursesFeed(), name='feed'),
10 | )
11 |
--------------------------------------------------------------------------------
/courses/__init__.py:
--------------------------------------------------------------------------------
1 | # Django signal receiver modules must imported early so that the signal
2 | # handling gets registered before any signals need to be sent.
3 |
4 | from .signals import update_course_meta_data_on_studio_publish
5 |
--------------------------------------------------------------------------------
/courses/choices.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | from django.utils.translation import ugettext_lazy as _
4 |
5 |
6 | COURSE_LEVEL_INTRODUCTORY = 'introductory'
7 | COURSE_LEVEL_INTERMEDIATE = 'intermediate'
8 | COURSE_LEVEL_ADVANCED = 'advanced'
9 |
10 | COURSE_LEVEL_CHOICES = (
11 | (COURSE_LEVEL_INTRODUCTORY, _('Introductory')),
12 | (COURSE_LEVEL_INTERMEDIATE, _('Intermediate')),
13 | (COURSE_LEVEL_ADVANCED, _('Advanced')),
14 | )
15 |
16 | # Please maintain alphabetical order for test consistancy
17 | COURSE_LANGUAGES = (('de', _('German')), ('en', _('English')), ('es', _('Spanish')), ('fr', _('French')))
18 |
--------------------------------------------------------------------------------
/courses/locale/fr/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/courses/locale/fr/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/courses/management/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/courses/management/__init__.py
--------------------------------------------------------------------------------
/courses/management/commands/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/courses/management/commands/__init__.py
--------------------------------------------------------------------------------
/courses/migrations/0002_is_visible_deprecated.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.contrib.auth.models import User
5 | from django.db import migrations, models
6 |
7 |
8 | class Migration(migrations.Migration):
9 | initial = True
10 |
11 | dependencies = [
12 | ('courses', '0001_initial'),
13 | ]
14 |
15 | operations = [
16 | ]
17 |
--------------------------------------------------------------------------------
/courses/migrations/0003_default_value_to_featured.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('courses', '0002_is_visible_deprecated'),
11 | ]
12 |
13 | operations = [
14 | migrations.AlterField(
15 | model_name='coursesubject',
16 | name='featured',
17 | field=models.BooleanField(default=False, db_index=True, verbose_name='featured'),
18 | ),
19 | ]
20 |
--------------------------------------------------------------------------------
/courses/migrations/0004_auto_20161011_1739.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('courses', '0003_default_value_to_featured'),
11 | ]
12 |
13 | operations = [
14 | migrations.AlterField(
15 | model_name='course',
16 | name='subjects',
17 | field=models.ManyToManyField(related_name='courses', to='courses.CourseSubject', blank=True),
18 | ),
19 | ]
20 |
--------------------------------------------------------------------------------
/courses/migrations/0005_add_show_about_page_field.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('courses', '0004_auto_20161011_1739'),
11 | ]
12 |
13 | operations = [
14 | migrations.AddField(
15 | model_name='course',
16 | name='show_about_page',
17 | field=models.BooleanField(default=True, help_text='Controls whether the course about page is visible', db_index=True, verbose_name='show course about page'),
18 | ),
19 | ]
20 |
--------------------------------------------------------------------------------
/courses/migrations/0006_default_to_false_for_show_in_catalog.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('courses', '0005_add_show_about_page_field'),
11 | ]
12 |
13 | operations = [
14 | migrations.AlterField(
15 | model_name='course',
16 | name='show_in_catalog',
17 | field=models.BooleanField(default=False, help_text='Controls whether a course is listed in the courses catalog page', db_index=True, verbose_name='show in catalog'),
18 | ),
19 | ]
20 |
--------------------------------------------------------------------------------
/courses/migrations/0007_auto_20190403_1113.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('courses', '0006_default_to_false_for_show_in_catalog'),
11 | ]
12 |
13 | operations = [
14 | migrations.AlterField(
15 | model_name='course',
16 | name='key',
17 | field=models.CharField(unique=True, max_length=255, verbose_name='Course key'),
18 | ),
19 | ]
20 |
--------------------------------------------------------------------------------
/courses/migrations/0008_auto_20191016_0452.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('courses', '0007_auto_20190403_1113'),
11 | ]
12 |
13 | operations = [
14 | migrations.AlterField(
15 | model_name='course',
16 | name='is_active',
17 | field=models.BooleanField(default=False, verbose_name='active'),
18 | ),
19 | migrations.AlterField(
20 | model_name='course',
21 | name='language',
22 | field=models.CharField(default=b'fr', max_length=255, verbose_name='language', db_index=True, choices=[(b'de', 'German'), (b'en', 'English'), (b'es', 'Spanish'), (b'fr', 'French')]),
23 | ),
24 | ]
25 |
--------------------------------------------------------------------------------
/courses/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/courses/migrations/__init__.py
--------------------------------------------------------------------------------
/courses/settings.py:
--------------------------------------------------------------------------------
1 | from django.conf import settings
2 |
3 |
4 | # Cutoff number of days to consider that a course starts soon or ends soon.
5 | NUMBER_DAYS_TOO_LATE = getattr(settings, 'NUMBER_DAYS_TOO_LATE', 7)
6 |
7 | FUN_THUMBNAIL_OPTIONS = getattr(settings, 'FUN_THUMBNAIL_OPTIONS', {
8 | 'avatar': {'size': (270, 150), 'crop': True},
9 | 'small': {'size': (150, 100), 'crop': 'smart'},
10 | 'mini': {'size': (50, 50), 'crop': 'smart'},
11 | })
12 |
13 | COURSE_ADMIN_READ_ONLY_FIELDS = getattr(settings, 'COURSE_ADMIN_READ_ONLY_FIELDS',
14 | ('key', 'title', 'image_url', 'university_display_name', 'start_date',
15 | 'end_date', 'enrollment_start_date', 'enrollment_end_date',
16 | 'thumbnails_info')
17 | )
18 |
--------------------------------------------------------------------------------
/courses/static/courses/css/course_list_view.css:
--------------------------------------------------------------------------------
1 |
2 |
3 | #result_list th.sortable.column-show_about_page a,
4 | #result_list th.sortable.column-show_in_catalog a,
5 | #result_list th.sortable.column-prevent_auto_update a,
6 | #result_list th.sortable.column-enrollment_start_date a,
7 | #result_list th.sortable.column-enrollment_end_date a
8 | {
9 | width: 30px;
10 | text-overflow: ellipsis;
11 | white-space: nowrap;
12 | overflow: hidden;
13 | display: inline-block;
14 | }
15 | #result_list th.sortable.column-show_about_page a:hover,
16 | #result_list th.sortable.column-show_in_catalog a:hover,
17 | #result_list th.sortable.column-prevent_auto_update a:hover,
18 | #result_list th.sortable.column-enrollment_start_date a:hover,
19 | #result_list th.sortable.column-enrollment_end_date a:hover
20 | {
21 | width: inherit;
22 | }
23 |
24 | input.vIntegerField {
25 | width: 30px;
26 | }
27 |
--------------------------------------------------------------------------------
/courses/templates/search/indexes/courses/course_text.txt:
--------------------------------------------------------------------------------
1 | {{ object.title }}
2 | {{ object.university_name }}
3 | {% for subject in object.subjects.all %}{{ subject.name }} {% endfor %}
4 | {% for teacher in object.courseteacher_related.all %}{{ teacher.full_name }} {% endfor %}
5 | {{ object.short_description }}
6 |
--------------------------------------------------------------------------------
/courses/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/courses/tests/__init__.py
--------------------------------------------------------------------------------
/courses_api/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/courses_api/__init__.py
--------------------------------------------------------------------------------
/courses_api/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/courses_api/tests/__init__.py
--------------------------------------------------------------------------------
/courses_api/urls.py:
--------------------------------------------------------------------------------
1 |
2 | from rest_framework.routers import DefaultRouter
3 |
4 | from .api import CourseAPIView, CourseSubjectAPIView
5 |
6 |
7 | router = DefaultRouter()
8 |
9 | router.register(r'api/courses', CourseAPIView, base_name='courses')
10 | router.register(r'api/course_subjects', CourseSubjectAPIView, base_name='course_subjects')
11 |
12 | urlpatterns = router.urls
13 |
--------------------------------------------------------------------------------
/forum_contributors/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/forum_contributors/__init__.py
--------------------------------------------------------------------------------
/forum_contributors/urls.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | from django.conf.urls import patterns, url
4 |
5 |
6 | urlpatterns = patterns('forum_contributors.views',
7 | url(r'^list-special-forum-contributors$', 'list_special_forum_contributors', name='list_special_forum_contributors_url'),
8 | url(r'^modify-special-forum-contributors$', 'modify_special_forum_contributors', name='modify_special_forum_contributors_url'),
9 | )
10 |
--------------------------------------------------------------------------------
/fun/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/__init__.py
--------------------------------------------------------------------------------
/fun/cms/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/cms/__init__.py
--------------------------------------------------------------------------------
/fun/cms/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/cms/tests/__init__.py
--------------------------------------------------------------------------------
/fun/cms/urls_youtube.py:
--------------------------------------------------------------------------------
1 | from django.conf.urls import url, patterns
2 |
3 | from videoproviders.patterns import SUBTITLE_ID_PATTERN
4 |
5 | urlpatterns = patterns('fun.cms.views.youtube',
6 | url(r'^subtitles/(?P{})$'.format(SUBTITLE_ID_PATTERN),
7 | 'download_subtitle', name='download_subtitle'),
8 | url(r'^upload_video$', 'upload_video', name='upload_video'),
9 | )
10 |
--------------------------------------------------------------------------------
/fun/cms/utils/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/cms/utils/__init__.py
--------------------------------------------------------------------------------
/fun/cms/views/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/cms/views/__init__.py
--------------------------------------------------------------------------------
/fun/cms/views/youtube.py:
--------------------------------------------------------------------------------
1 | from django.http import HttpResponse, Http404
2 | from videoproviders.api.youtube import Client
3 |
4 | from ..utils.views import has_write_access_to_course
5 | from util.json_request import JsonResponse
6 |
7 |
8 | @has_write_access_to_course
9 | def download_subtitle(request, course_key_string, subtitle_id):
10 | client = Client(course_key_string)
11 | return HttpResponse(client.download_subtitle(subtitle_id))
12 |
13 |
14 | @has_write_access_to_course
15 | def upload_video(request, course_key_string):
16 | file_obj = request.FILES.get(Client.FILE_PARAMETER_NAME)
17 | if not file_obj:
18 | raise Http404
19 |
20 | client = Client(course_key_string)
21 | result = client.upload_video(file_obj)
22 |
23 | return JsonResponse(result)
24 |
--------------------------------------------------------------------------------
/fun/common_urls.py:
--------------------------------------------------------------------------------
1 | from django.conf import settings
2 | from django.conf.urls import url, include, patterns
3 |
4 |
5 | urlpatterns = []
6 |
7 | if settings.DEBUG:
8 | import debug_toolbar
9 | urlpatterns += patterns(
10 | '',
11 | url(r'^__debug__/', include(debug_toolbar.urls)),
12 |
13 | # Fonts are loaded from /fonts/ in DEBUG mode because the loaded
14 | # stylesheets are not compiled/compressed.
15 | url(r'^(?Pfonts/vendor/.+)$',
16 | view='django.views.static.serve',
17 | kwargs={'document_root' : settings.STATIC_ROOT}),
18 | )
19 |
--------------------------------------------------------------------------------
/fun/context_processor.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | from django.conf import settings
4 |
5 | from microsite_configuration import microsite
6 |
7 |
8 | def fun_settings(request):
9 | """Add ENVIRONMENT name (Brick, Ketch, dev) to template context when in backoffice application."""
10 | context = {}
11 | if request.path.startswith('/backoffice/'):
12 | context['ENVIRONMENT'] = settings.ENVIRONMENT
13 |
14 | if settings.FEATURES['USE_MICROSITES']:
15 | context['USE_MICROSITE'] = settings.FEATURES['USE_MICROSITES']
16 | context['MICROSITE_SITENAME'] = microsite.get_value('SITE_NAME')
17 | context['MICROSITE_PLATFORM'] = microsite.get_value('platform_name')
18 | return context
19 |
--------------------------------------------------------------------------------
/fun/envs/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/envs/__init__.py
--------------------------------------------------------------------------------
/fun/envs/cms/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/envs/cms/__init__.py
--------------------------------------------------------------------------------
/fun/envs/lms/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/envs/lms/__init__.py
--------------------------------------------------------------------------------
/fun/envs/lms/dev_with_worker.py:
--------------------------------------------------------------------------------
1 | from .dev import *
2 |
3 | ################################# CELERY ######################################
4 | # See edx-platform/lms/envs/dev_with_worker.py
5 | # All you have to do is start a celery worker with:
6 | # ./manage.py lms --settings=fun.lms_dev_with_worker celery worker
7 | CELERY_ALWAYS_EAGER = False
8 | BROKER_URL = 'django://'
9 | INSTALLED_APPS += ('djcelery.transport', )
10 | DJKOMBU_POLLING_INTERVAL = 1.0
11 | MIDDLEWARE_CLASSES = tuple(
12 | c for c in MIDDLEWARE_CLASSES
13 | if c != 'django.middleware.transaction.TransactionMiddleware')
14 |
--------------------------------------------------------------------------------
/fun/envs/lms/microsite/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/envs/lms/microsite/__init__.py
--------------------------------------------------------------------------------
/fun/envs/lms/microsite/common.py:
--------------------------------------------------------------------------------
1 | import sys
2 | from path import path
3 |
4 | MICROSITE_ROOT_DIR = path("/edx/app/edxapp/fun-microsites")
5 |
6 | def get_microsite_configuration(hostname):
7 | """
8 | Return the microsite configuration with properly defined hostnames. The
9 | value returned is suitable for the MICROSITE_CONFIGURATION variable.
10 | """
11 | sys.path.append(MICROSITE_ROOT_DIR)
12 | try:
13 | import fun_microsites
14 | configuration = fun_microsites.get_configuration(hostname)
15 | except ImportError:
16 | configuration = {}
17 | finally:
18 | sys.path.pop()
19 | return configuration
20 |
21 | def patch_features_for_microsites(features):
22 | features['USE_MICROSITES'] = True
23 | features['USE_CUSTOM_THEME'] = False
24 | features['ENABLE_MKTG_SITE'] = False
25 |
--------------------------------------------------------------------------------
/fun/envs/lms/microsite/dev.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | from ..dev import *
4 | from .common import *
5 |
6 | MICROSITE_CONFIGURATION = get_microsite_configuration("localhost")
7 |
8 | FEATURES['USE_MICROSITES'] = True
9 |
10 | FEATURES['AUTOMATIC_AUTH_FOR_TESTING'] = True
11 |
12 | # There are 2 ways to customize Edx font-end: The "Stanford Theming" way and the Microsite way.
13 | # Here we are using microsites, so we disable the "Custom Theme" feature.
14 | THEME_NAME = ""
15 | FEATURES['USE_CUSTOM_THEME'] = False
16 | FEATURES['ENABLE_MKTG_SITE'] = False
17 |
--------------------------------------------------------------------------------
/fun/lms/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/lms/__init__.py
--------------------------------------------------------------------------------
/fun/lms/views.py:
--------------------------------------------------------------------------------
1 | import re
2 | from django.conf import settings
3 | from django.core.urlresolvers import reverse
4 | from django.http import HttpResponse
5 | from django.shortcuts import redirect
6 |
7 |
8 | def richie(request, redirect_to):
9 | """Extract params from route to redirect to the right Richie view"""
10 | if getattr(settings, "PLATFORM_RICHIE_URL", None) is not None:
11 | return redirect(
12 | "{richie_url:s}/{target:s}".format(
13 | richie_url=settings.PLATFORM_RICHIE_URL, target=redirect_to
14 | )
15 | )
16 |
17 | return redirect(reverse("dashboard"))
18 |
--------------------------------------------------------------------------------
/fun/locale/babel-django.cfg:
--------------------------------------------------------------------------------
1 | [extractors]
2 | django = django_babel.extract:extract_django
3 | underscore = django_babel_underscore:extract
4 |
5 | [python: **/**.py]
6 | input_encoding = utf-8
7 |
8 | [django: **/backoffice/**.html]
9 | input_encoding = utf-8
10 |
11 | [mako: **/**.html]
12 | input_encoding = utf-8
13 | [mako: **/**.xml]
14 | input_encoding = utf-8
15 |
16 | [underscore: **/fun/templates/**/**.underscore]
17 | input_encoding = utf-8
18 |
--------------------------------------------------------------------------------
/fun/locale/babel-djangojs.cfg:
--------------------------------------------------------------------------------
1 | [extractors]
2 | underscore = django_babel_underscore:extract
3 |
4 | [underscore: **/templates/**/**.js]
5 | input_encoding = utf-8
6 |
7 | [underscore: **/templates/**/**.underscore]
8 | input_encoding = utf-8
9 |
--------------------------------------------------------------------------------
/fun/locale/de/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/locale/de/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/fun/locale/de/LC_MESSAGES/djangojs.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/locale/de/LC_MESSAGES/djangojs.mo
--------------------------------------------------------------------------------
/fun/locale/fr/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/locale/fr/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/fun/locale/fr/LC_MESSAGES/djangojs.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/locale/fr/LC_MESSAGES/djangojs.mo
--------------------------------------------------------------------------------
/fun/management/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/management/__init__.py
--------------------------------------------------------------------------------
/fun/management/commands/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/management/commands/__init__.py
--------------------------------------------------------------------------------
/fun/management/commands/generate_fun_verified_certificates.py:
--------------------------------------------------------------------------------
1 | from django.core.management.base import BaseCommand
2 |
3 | from backoffice.certificate_manager.tasks_verified import iter_generated_course_verified_certificates
4 | from opaque_keys.edx.keys import CourseKey
5 |
6 | class Command(BaseCommand):
7 | args = ''
8 | help = 'generate FUN verified certificates for a course'
9 |
10 | def add_arguments(self, parser):
11 | parser.add_argument('poll_id', nargs='+', type=int)
12 |
13 | def handle(self, *args, **options):
14 | for course_key_string in args:
15 | course_id = CourseKey.from_string(course_key_string)
16 | for status in iter_generated_course_verified_certificates(course_id):
17 | print status
--------------------------------------------------------------------------------
/fun/management/commands/run-script.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | # This is useful for one-time scripts that need to run within a django
4 | # environment.
5 | # E.g: ./manage.py run-script ../sample_data_from_database.py --option=value arg1 arg2
6 | from django.core.management.base import BaseCommand, CommandError
7 |
8 | import imp
9 | import sys
10 |
11 |
12 | class Command(BaseCommand):
13 |
14 | help = """Run a non-django script with django settings."""
15 | args = " [...]"
16 |
17 | def handle(self, *args, **options):
18 | if len(args) == 0:
19 | raise CommandError("Path to script to run is required")
20 | sys.argv = list(args)
21 | imp.load_source("__main__", args[0])
22 |
--------------------------------------------------------------------------------
/fun/management/commands/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/management/commands/tests/__init__.py
--------------------------------------------------------------------------------
/fun/middleware/__init__.py:
--------------------------------------------------------------------------------
1 | # _*_ coding: utf8 _*_
2 |
3 | from .enforce_legal_acceptance import LegalAcceptance
4 | from .oauth2_step import Oauth2Step
5 |
--------------------------------------------------------------------------------
/fun/smtp/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/smtp/__init__.py
--------------------------------------------------------------------------------
/fun/static/bootstrap/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/bootstrap/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/fun/static/bootstrap/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/bootstrap/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/fun/static/bootstrap/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/bootstrap/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/fun/static/bootstrap/js/npm.js:
--------------------------------------------------------------------------------
1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.
2 | require('../../js/transition.js')
3 | require('../../js/alert.js')
4 | require('../../js/button.js')
5 | require('../../js/carousel.js')
6 | require('../../js/collapse.js')
7 | require('../../js/dropdown.js')
8 | require('../../js/modal.js')
9 | require('../../js/tooltip.js')
10 | require('../../js/popover.js')
11 | require('../../js/scrollspy.js')
12 | require('../../js/tab.js')
13 | require('../../js/affix.js')
--------------------------------------------------------------------------------
/fun/static/bulk_email/images/facebook.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/bulk_email/images/facebook.png
--------------------------------------------------------------------------------
/fun/static/bulk_email/images/logo-fun.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/bulk_email/images/logo-fun.png
--------------------------------------------------------------------------------
/fun/static/bulk_email/images/logo-funmooc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/bulk_email/images/logo-funmooc.png
--------------------------------------------------------------------------------
/fun/static/bulk_email/images/twitter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/bulk_email/images/twitter.png
--------------------------------------------------------------------------------
/fun/static/ckeditor/ckeditor-init.js:
--------------------------------------------------------------------------------
1 | // FUN ckeditor expect to fin jQuery reference on `$` but it's actually on `django.jQuery`
2 | django.jQuery(function($){
3 |
4 | function initCKEditor(){
5 | $('textarea[data-type=ckeditortype]').each(function(){
6 | if($(this).data('processed') == "0" && $(this).attr('id').indexOf('__prefix__') == -1){
7 | $(this).data('processed',"1");
8 | CKEDITOR.replace($(this).attr('id'), $(this).data('config'));
9 | }
10 | });
11 | }
12 |
13 | initCKEditor();
14 |
15 | $(".add-row a").click(function(){
16 | initCKEditor();
17 | return true;
18 | });
19 |
20 | });
--------------------------------------------------------------------------------
/fun/static/datatables/images/back_disabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/datatables/images/back_disabled.png
--------------------------------------------------------------------------------
/fun/static/datatables/images/back_enabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/datatables/images/back_enabled.png
--------------------------------------------------------------------------------
/fun/static/datatables/images/back_enabled_hover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/datatables/images/back_enabled_hover.png
--------------------------------------------------------------------------------
/fun/static/datatables/images/forward_disabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/datatables/images/forward_disabled.png
--------------------------------------------------------------------------------
/fun/static/datatables/images/forward_enabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/datatables/images/forward_enabled.png
--------------------------------------------------------------------------------
/fun/static/datatables/images/forward_enabled_hover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/datatables/images/forward_enabled_hover.png
--------------------------------------------------------------------------------
/fun/static/datatables/images/sort_asc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/datatables/images/sort_asc.png
--------------------------------------------------------------------------------
/fun/static/datatables/images/sort_asc_disabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/datatables/images/sort_asc_disabled.png
--------------------------------------------------------------------------------
/fun/static/datatables/images/sort_both.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/datatables/images/sort_both.png
--------------------------------------------------------------------------------
/fun/static/datatables/images/sort_desc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/datatables/images/sort_desc.png
--------------------------------------------------------------------------------
/fun/static/datatables/images/sort_desc_disabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/datatables/images/sort_desc_disabled.png
--------------------------------------------------------------------------------
/fun/static/fun/css/sandbox-cms.css:
--------------------------------------------------------------------------------
1 | #view-top h1.branding img { /* Shift original image to hide it and set background */
2 | display: block;
3 | -moz-box-sizing: border-box;
4 | box-sizing: border-box;
5 | background: url('../images/edx-studio-logo-sandbox.png') no-repeat;
6 | background-size: 190px 42px;
7 | width: 190px;
8 | height: 42px;
9 | padding-left: 190px;
10 | }
11 |
12 | span.account-username {
13 | color: #a06123;
14 | }
15 |
16 |
--------------------------------------------------------------------------------
/fun/static/fun/images/edx-studio-logo-sandbox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/fun/images/edx-studio-logo-sandbox.png
--------------------------------------------------------------------------------
/fun/static/fun/images/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/fun/images/favicon.ico
--------------------------------------------------------------------------------
/fun/static/fun/images/spinner.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/fun/images/spinner.gif
--------------------------------------------------------------------------------
/fun/static/fun/js/vendor/videojs/VERSION:
--------------------------------------------------------------------------------
1 | 4.12.11
2 |
--------------------------------------------------------------------------------
/fun/static/fun/js/vendor/videojs/demo.captions.vtt:
--------------------------------------------------------------------------------
1 | WEBVTT
2 |
3 | 00:00.700 --> 00:04.110
4 | Captions describe all relevant audio for the hearing impaired.
5 | [ Heroic music playing for a seagull ]
6 |
7 | 00:04.500 --> 00:05.000
8 | [ Splash!!! ]
9 |
10 | 00:05.100 --> 00:06.000
11 | [ Sploosh!!! ]
12 |
13 | 00:08.000 --> 00:09.225
14 | [ Splash...splash...splash splash splash ]
15 |
16 | 00:10.525 --> 00:11.255
17 | [ Splash, Sploosh again ]
18 |
19 | 00:13.500 --> 00:14.984
20 | Dolphin: eeeEEEEEeeee!
21 |
22 | 00:14.984 --> 00:16.984
23 | Dolphin: Squawk! eeeEEE?
24 |
25 | 00:25.000 --> 00:28.284
26 | [ A whole ton of splashes ]
27 |
28 | 00:29.500 --> 00:31.000
29 | Mine. Mine. Mine.
30 |
31 | 00:34.300 --> 00:36.000
32 | Shark: Chomp
33 |
34 | 00:36.800 --> 00:37.900
35 | Shark: CHOMP!!!
36 |
37 | 00:37.861 --> 00:41.193
38 | EEEEEEOOOOOOOOOOWHALENOISE
39 |
40 | 00:42.593 --> 00:45.611
41 | [ BIG SPLASH ]
--------------------------------------------------------------------------------
/fun/static/fun/js/vendor/videojs/font/vjs.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/fun/js/vendor/videojs/font/vjs.eot
--------------------------------------------------------------------------------
/fun/static/fun/js/vendor/videojs/font/vjs.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/fun/js/vendor/videojs/font/vjs.ttf
--------------------------------------------------------------------------------
/fun/static/fun/js/vendor/videojs/font/vjs.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/fun/js/vendor/videojs/font/vjs.woff
--------------------------------------------------------------------------------
/fun/static/fun/js/vendor/videojs/video-js.swf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/static/fun/js/vendor/videojs/video-js.swf
--------------------------------------------------------------------------------
/fun/tasks.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | from celery import shared_task
4 |
5 | from django.core.management import call_command
6 |
7 |
8 | @shared_task
9 | def update_search_index(*args, **kwargs):
10 | '''
11 | A task that serves as proxy to the management command
12 | for updating search index.
13 | Can be used for instance to run periodic tasks.
14 | '''
15 | call_command('update_index', *args, **kwargs)
16 |
--------------------------------------------------------------------------------
/fun/templates/cms/videoupload/js/list.underscore:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | <%- gettext("Preview") %>
9 | <%- gettext("Title") %>
10 | <%- gettext("Created at") %>
11 | ID
12 | <%- gettext("Status") %>
13 | <%- gettext("Actions") %>
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/fun/templates/cms/videoupload/js/modal-button.underscore:
--------------------------------------------------------------------------------
1 | <%
2 | // Override button template in order to override the onclick event.
3 | // Otherwise, the page scrolls to the top every time the action button
4 | // is clicked.
5 | %>
6 |
7 | <%= name %>
8 |
9 |
--------------------------------------------------------------------------------
/fun/templates/cms/videoupload/js/parameters-subtitle.underscore:
--------------------------------------------------------------------------------
1 | <%= language_label %>
2 |
3 |
8 |
9 |
--------------------------------------------------------------------------------
/fun/templates/cms/videoupload/js/parameters-thumbnail.underscore:
--------------------------------------------------------------------------------
1 |
2 |
<%= gettext("Thumbnail") %>
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/fun/templates/cms/videoupload/js/parameters.underscore:
--------------------------------------------------------------------------------
1 |
2 |
3 |
<%= title %>
4 |
5 |
6 |
<%= gettext("Subtitles") %>
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | <%= gettext("Language") %>
16 | <%= gettext("Download") %>
17 | <%= gettext("Action") %>
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/fun/templates/fun/emails/base_email.html:
--------------------------------------------------------------------------------
1 | {% load static %}
2 |
3 |
4 |
5 |
6 |
18 |
19 |
20 |
21 |
22 | {% block content %}{% endblock %}
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/fun/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/tests/__init__.py
--------------------------------------------------------------------------------
/fun/utils/export_data.py:
--------------------------------------------------------------------------------
1 | import csv
2 | from datetime import datetime
3 | from StringIO import StringIO
4 |
5 | from django.http import HttpResponse
6 |
7 |
8 | def csv_response(header_row, data_rows, filename):
9 | def encode_data(data):
10 | if isinstance(data, unicode):
11 | return data.encode('utf-8')
12 | elif isinstance(data, datetime):
13 | return data.strftime('%Y/%m/%d')
14 | else:
15 | return u"{}".format(data)
16 |
17 | response_content = StringIO()
18 | writer = csv.writer(response_content)
19 | writer.writerow([field.encode('utf-8') for field in header_row])
20 | for data_row in data_rows:
21 | writer.writerow([encode_data(d) for d in data_row])
22 | response_content.seek(0)
23 |
24 | response = HttpResponse(response_content.read(), content_type='text/csv')
25 | response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename)
26 | return response
27 |
--------------------------------------------------------------------------------
/fun/utils/html.py:
--------------------------------------------------------------------------------
1 | import bs4
2 |
3 | def first_paragraph_text(html):
4 | soup = bs4.BeautifulSoup(html)
5 | for paragraph in soup.find_all('p'):
6 | text = paragraph.get_text()
7 | if not text:
8 | continue
9 | return text
10 | return ""
11 |
12 | def truncate_first_paragraph(html, max_length):
13 | """
14 | Truncate the first non-empty paragraph from an html text such that its
15 | total length (including '...') is less than or equal to max_length.
16 | """
17 | text = first_paragraph_text(html)
18 | if len(text) <= max_length:
19 | return text
20 | else:
21 | new_text_length = max(max_length - 3, 0)
22 | return text[:new_text_length] + "..."
23 |
--------------------------------------------------------------------------------
/fun/utils/i18n.py:
--------------------------------------------------------------------------------
1 | from django.conf.global_settings import LANGUAGES
2 |
3 | from django.utils.translation import ugettext
4 |
5 |
6 | LANGUAGE_DICT = dict(LANGUAGES)
7 |
8 | def language_name(language_code):
9 | """Language corresponding to the given code in the current language.
10 |
11 | Args:
12 | language_code (str): e.g: 'fr', 'en'
13 | Returns:
14 | language (unicode): translated name of the language. Returns the
15 | language code if the language was not found.
16 | """
17 | language = LANGUAGE_DICT.get(language_code)
18 | if language:
19 | return ugettext(language)
20 | else:
21 | return language_code
22 |
--------------------------------------------------------------------------------
/fun/utils/mako.py:
--------------------------------------------------------------------------------
1 | from django.shortcuts import render_to_response
2 |
3 | class MakoTemplateMixin(object):
4 | """
5 | A mixin used to render templates with mako
6 | """
7 | def render_to_response(self, context, template_name=None, **response_kwargs):
8 | template_name = template_name or self.template_name
9 | response = render_to_response(template_name, context, **response_kwargs)
10 | return response
11 |
--------------------------------------------------------------------------------
/fun/utils/managers.py:
--------------------------------------------------------------------------------
1 | from django.db import models
2 |
3 |
4 | class ChainableManager(models.Manager):
5 | '''
6 | Helps providing chainability: `MyModel.objects.published().start_soon()`.
7 | Filter methods defined in Django Manager class cannot be chained to each other.
8 | Instead of adding our new filters to the custom manager, we add them to a custom
9 | queryset. But we still want to be able to access them as methods of the manager.
10 | '''
11 | queryset_class = None
12 |
13 | def get_query_set(self):
14 | return self.queryset_class(self.model)
15 |
16 | def __getattr__(self, attr, *args):
17 | try:
18 | return getattr(self.__class__, attr, *args)
19 | except AttributeError:
20 | return getattr(self.get_query_set(), attr, *args)
21 |
22 |
23 |
--------------------------------------------------------------------------------
/fun/utils/mongo.py:
--------------------------------------------------------------------------------
1 | import pymongo
2 |
3 | from django.conf import settings
4 |
5 | MONGO = settings.CONTENTSTORE['DOC_STORE_CONFIG']
6 |
7 |
8 | def connect_to_mongo():
9 | """Connect to FUN Mongo database."""
10 | db = pymongo.database.Database(
11 | pymongo.MongoClient(host=MONGO['host']),
12 | MONGO['db'])
13 | if 'user' in MONGO:
14 | db.authenticate(MONGO['user'], MONGO['password'])
15 | return db
16 |
--------------------------------------------------------------------------------
/fun/utils/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun/utils/tests/__init__.py
--------------------------------------------------------------------------------
/fun/utils/tests/test_countries.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 | from django.utils.translation import ugettext as _
3 |
4 | from fun.utils import countries
5 |
6 |
7 | class CountriesTests(TestCase):
8 |
9 | def test_get_country_name(self):
10 | self.assertEqual(_("France"), countries.get_country_name('FR'))
11 | self.assertEqual(_("Unknown"), countries.get_country_name(countries.UNKNOWN_COUNTRY_CODE))
12 |
13 | def test_territory_country(self):
14 | self.assertEqual('FR', countries.territory_country('FR'))
15 | self.assertEqual('FR', countries.territory_country('GP'))
16 | self.assertEqual('NL', countries.territory_country('NL'))
17 | # XZ does not exist
18 | self.assertEqual(countries.UNKNOWN_COUNTRY_CODE, countries.territory_country('XZ'))
19 |
--------------------------------------------------------------------------------
/fun_api/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun_api/__init__.py
--------------------------------------------------------------------------------
/fun_api/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 |
3 | from rest_framework.authtoken.models import Token
4 | from rest_framework.authtoken.admin import TokenAdmin
5 |
6 |
7 | class FunTokenAdmin(TokenAdmin):
8 | raw_id_fields = ('user',)
9 |
10 |
11 | admin.site.unregister(Token)
12 | admin.site.register(Token, FunTokenAdmin)
13 |
--------------------------------------------------------------------------------
/fun_api/locale/fr/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun_api/locale/fr/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/fun_api/locale/fr/LC_MESSAGES/django.po:
--------------------------------------------------------------------------------
1 |
2 | msgid ""
3 | msgstr ""
4 | "Project-Id-Version: FUN-MOOC 2\n"
5 | "Report-Msgid-Bugs-To: team@openfun.fr\n"
6 | "POT-Creation-Date: 2016-03-01 14:50+0100\n"
7 | "PO-Revision-Date: 2016-03-01 14:50+0000\n"
8 | "Last-Translator: FUN \n"
9 | "Language-Team: FUN \n"
10 | "Plural-Forms: nplurals=2; plural=(n > 1)\n"
11 | "MIME-Version: 1.0\n"
12 | "Content-Type: text/plain; charset=utf-8\n"
13 | "Content-Transfer-Encoding: 8bit\n"
14 | "Generated-By: Babel 1.3\n"
15 |
16 | #: /edx/app/edxapp/fun-apps/fun_api/serializers.py:0
17 | msgid "User is not staff member."
18 | msgstr "L'utilisateur n'est pas membre 'staff'"
19 |
20 |
--------------------------------------------------------------------------------
/fun_api/models.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun_api/models.py
--------------------------------------------------------------------------------
/fun_api/serializers.py:
--------------------------------------------------------------------------------
1 |
2 | from django.core.exceptions import PermissionDenied
3 |
4 | from rest_framework.authtoken.serializers import AuthTokenSerializer
5 |
6 |
7 | class FunAuthTokenSerializer(AuthTokenSerializer):
8 | """
9 | Adds specific authentication validation for FUN API.
10 | """
11 |
12 | def validate(self, attrs):
13 | super(FunAuthTokenSerializer, self).validate(attrs)
14 | user = attrs['user']
15 | if user.is_staff or user.is_superuser:
16 | return attrs
17 | raise PermissionDenied()
18 |
19 |
20 | class UpdateSerializerMixin(object):
21 | """
22 | Helpers and common functionalities for update serializers,
23 | for instance for Course and University validation on update.
24 | """
25 |
26 | def validate(self, data):
27 | if self.instance.prevent_auto_update:
28 | raise PermissionDenied()
29 | return data
30 |
--------------------------------------------------------------------------------
/fun_api/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun_api/tests/__init__.py
--------------------------------------------------------------------------------
/fun_api/urls.py:
--------------------------------------------------------------------------------
1 | from django.conf.urls import patterns, url
2 |
3 |
4 | urlpatterns = patterns('fun_api.views',
5 | url(r'^$', 'get_token', name='get-token'),
6 | )
7 |
--------------------------------------------------------------------------------
/fun_api/views.py:
--------------------------------------------------------------------------------
1 | from rest_framework.authtoken.views import ObtainAuthToken
2 |
3 | from .serializers import FunAuthTokenSerializer
4 |
5 |
6 | class GetToken(ObtainAuthToken):
7 | serializer_class = FunAuthTokenSerializer
8 |
9 |
10 | get_token = GetToken.as_view()
11 |
--------------------------------------------------------------------------------
/fun_certificates/Arial.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun_certificates/Arial.ttf
--------------------------------------------------------------------------------
/fun_certificates/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun_certificates/__init__.py
--------------------------------------------------------------------------------
/fun_certificates/locale/fr/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun_certificates/locale/fr/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/fun_certificates/static/fun_certificates/images/certificat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun_certificates/static/fun_certificates/images/certificat.png
--------------------------------------------------------------------------------
/fun_certificates/static/fun_certificates/images/contours.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun_certificates/static/fun_certificates/images/contours.jpg
--------------------------------------------------------------------------------
/fun_certificates/static/fun_certificates/images/contours.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun_certificates/static/fun_certificates/images/contours.png
--------------------------------------------------------------------------------
/fun_certificates/static/fun_certificates/images/logo-FUN-certif.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun_certificates/static/fun_certificates/images/logo-FUN-certif.png
--------------------------------------------------------------------------------
/fun_certificates/static/fun_certificates/images/palmes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun_certificates/static/fun_certificates/images/palmes.png
--------------------------------------------------------------------------------
/fun_certificates/static/fun_certificates/images/tampon-fun.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun_certificates/static/fun_certificates/images/tampon-fun.png
--------------------------------------------------------------------------------
/fun_certificates/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun_certificates/tests/__init__.py
--------------------------------------------------------------------------------
/fun_certificates/urls.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | from django.conf.urls import patterns, url
4 |
5 |
6 | urlpatterns = patterns('fun_certificates.views',
7 | url(r'^cert/(?P[\w\d]+)/$', 'short_cert_url', name='short-cert-url'),
8 | )
9 |
--------------------------------------------------------------------------------
/fun_certificates/utils.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | from hashids import Hashids
4 |
5 | from opaque_keys.edx.keys import CourseKey
6 |
7 | from certificates.models import GeneratedCertificate
8 |
9 |
10 | def cert_id_encode(key, cert_id):
11 | hashids = Hashids(salt=key)
12 | hashid = hashids.encode(int(cert_id))
13 | return hashid
14 |
15 |
16 | def cert_id_decode(key, hashid):
17 | hashids = Hashids(salt=key)
18 | try:
19 | cert_id = hashids.decode(hashid)[0]
20 | except IndexError:
21 | # Not encoded with the same key
22 | return None
23 | return cert_id
24 |
25 |
26 | def get_encoded_cert_id(key, course_id, user_id):
27 | cert = GeneratedCertificate.objects.get(course_id=CourseKey.from_string(course_id), user_id=user_id)
28 | return cert_id_encode(key, cert.id)
29 |
--------------------------------------------------------------------------------
/fun_instructor/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun_instructor/__init__.py
--------------------------------------------------------------------------------
/fun_instructor/instructor_task_api/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/fun_instructor/instructor_task_api/__init__.py
--------------------------------------------------------------------------------
/fun_instructor/instructor_task_api/tests.py:
--------------------------------------------------------------------------------
1 | import unittest
2 |
3 | from fun_instructor.instructor_task_api.submit_tasks import submit_generate_answers_distribution_report
4 | from fun.tests.utils import skipUnlessLms
5 |
6 |
7 | @unittest.skip("Skip this test until we have adequately split our apps in lms/cms/common categories")
8 | @skipUnlessLms
9 | class FunInstructorTaskCourseSubmitTest(unittest.TestCase):
10 |
11 | def test_submit_generate_answers_distribution_report(self):
12 | api_call = lambda: submit_generate_answers_distribution_report(
13 | self.create_task_request(self.instructor),
14 | self.course.id,
15 | task_input={}
16 | )
17 | self._test_resubmission(api_call)
18 |
--------------------------------------------------------------------------------
/fun_instructor/urls.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | from django.conf.urls import url, patterns
4 |
5 | urlpatterns = patterns( '',
6 | url(r'^list_report_downloads$',
7 | 'fun_instructor.views.list_report_downloads', name="list_report_downloads"),)
8 |
--------------------------------------------------------------------------------
/funsite/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/__init__.py
--------------------------------------------------------------------------------
/funsite/locale/fr/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/locale/fr/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/funsite/static/funsite/arg.js/.bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "arg.js",
3 | "version": "1.3.1",
4 | "homepage": "https://github.com/stretchr/arg.js",
5 | "authors": [
6 | "Mat Ryer",
7 | "Ryan Quinn"
8 | ],
9 | "description": "Lightweight URL argument and parameter parser",
10 | "main": "dist/arg-1.2.js",
11 | "keywords": [
12 | "javascript",
13 | "arguments"
14 | ],
15 | "license": "MIT",
16 | "ignore": [
17 | "**/.*",
18 | "node_modules",
19 | "bower_components",
20 | "test",
21 | "tests"
22 | ],
23 | "_release": "1.3.1",
24 | "_resolution": {
25 | "type": "version",
26 | "tag": "v1.3.1",
27 | "commit": "66a9805ec8786b2ca2aee1dbbce5595dc8028f77"
28 | },
29 | "_source": "git://github.com/stretchr/arg.js.git",
30 | "_target": "~1.3.1",
31 | "_originalSource": "arg.js",
32 | "_direct": true
33 | }
--------------------------------------------------------------------------------
/funsite/static/funsite/arg.js/arg.js.nuspec:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | arg.js
5 | 1.2.0
6 | Lightweight URL argument and parameter parser
7 | Stretchr, Inc.
8 | Stretchr, Inc.
9 | https://github.com/stretchr/arg.js
10 | false
11 | Arg.js gives you quick and easy access to parameters in the URL.
12 | Arg.js gives you quick and easy access to parameters in the URL.
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/funsite/static/funsite/arg.js/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "arg.js",
3 | "version": "1.2.0",
4 | "homepage": "https://github.com/stretchr/arg.js",
5 | "authors": [
6 | "Mat Ryer",
7 | "Ryan Quinn"
8 | ],
9 | "description": "Lightweight URL argument and parameter parser",
10 | "main": "dist/arg-1.2.js",
11 | "keywords": [
12 | "javascript",
13 | "arguments"
14 | ],
15 | "license": "MIT",
16 | "ignore": [
17 | "**/.*",
18 | "node_modules",
19 | "bower_components",
20 | "test",
21 | "tests"
22 | ]
23 | }
24 |
--------------------------------------------------------------------------------
/funsite/static/funsite/bootstrap/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/bootstrap/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/funsite/static/funsite/bootstrap/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/bootstrap/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/funsite/static/funsite/bootstrap/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/bootstrap/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/funsite/static/funsite/bootstrap/fonts/glyphicons-halflings-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/bootstrap/fonts/glyphicons-halflings-regular.woff2
--------------------------------------------------------------------------------
/funsite/static/funsite/fonts/Raleway-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/fonts/Raleway-Light.ttf
--------------------------------------------------------------------------------
/funsite/static/funsite/fonts/Raleway-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/fonts/Raleway-Regular.ttf
--------------------------------------------------------------------------------
/funsite/static/funsite/fonts/Raleway-SemiBold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/fonts/Raleway-SemiBold.ttf
--------------------------------------------------------------------------------
/funsite/static/funsite/images/homepage1280.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/homepage1280.jpg
--------------------------------------------------------------------------------
/funsite/static/funsite/images/homepage1900.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/homepage1900.jpg
--------------------------------------------------------------------------------
/funsite/static/funsite/images/homepage2495.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/homepage2495.jpg
--------------------------------------------------------------------------------
/funsite/static/funsite/images/homepage768.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/homepage768.jpg
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/accessibility-red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/accessibility-red.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/bubble-red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/bubble-red.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/by-nc-nd.eu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/by-nc-nd.eu.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/by-nc-sa.eu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/by-nc-sa.eu.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/by-nc.eu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/by-nc.eu.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/calendar-red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/calendar-red.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/calendar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/calendar.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/clock-red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/clock-red.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/diploma-red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/diploma-red.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/english-flag.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/english-flag.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/exclamation-red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/exclamation-red.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/filter-checkbox-checked.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/filter-checkbox-checked.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/filter-checkbox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/filter-checkbox.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/folder-red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/folder-red.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/french-flag.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/french-flag.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/german-flag.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/german-flag.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/letter-red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/letter-red.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/link-red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/link-red.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/login-email.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/login-email.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/login-password.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/login-password.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/register-hover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/register-hover.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/register.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/register.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/sandwich.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/sandwich.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/search.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/search.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/small-blog.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/small-blog.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/small-facebook.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/small-facebook.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/small-gplus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/small-gplus.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/small-linkedin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/small-linkedin.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/small-tumblr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/small-tumblr.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/small-twitter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/small-twitter.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/social-networks-hover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/social-networks-hover.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/social-networks.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/social-networks.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/spanish-flag.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/spanish-flag.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/star-red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/star-red.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/user.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/user.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/verified-course.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/verified-course.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/verified-course60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/verified-course60.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/video-play-button.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/video-play-button.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/icones/video-play-button2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/icones/video-play-button2.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/logos/cines.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/logos/cines.jpg
--------------------------------------------------------------------------------
/funsite/static/funsite/images/logos/facebook32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/logos/facebook32.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/logos/fun61-sandbox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/logos/fun61-sandbox.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/logos/funmooc173.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/logos/funmooc173.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/logos/funmooc45.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/logos/funmooc45.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/logos/funmoocattest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/logos/funmoocattest.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/logos/funmoocfp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/logos/funmoocfp.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/logos/inria.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/logos/inria.jpg
--------------------------------------------------------------------------------
/funsite/static/funsite/images/logos/menes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/logos/menes.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/logos/mesr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/logos/mesr.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/logos/powered-by-openedx.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/logos/powered-by-openedx.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/logos/twitter32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/logos/twitter32.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/news-background.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/news-background.jpg
--------------------------------------------------------------------------------
/funsite/static/funsite/images/proctoru/image001.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/proctoru/image001.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/proctoru/image002.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/proctoru/image002.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/proctoru/image003.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/proctoru/image003.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/proctoru/image004.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/proctoru/image004.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/proctoru/image005.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/proctoru/image005.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/proctoru/image006.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/proctoru/image006.jpg
--------------------------------------------------------------------------------
/funsite/static/funsite/images/proctoru/image007.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/proctoru/image007.jpg
--------------------------------------------------------------------------------
/funsite/static/funsite/images/proctoru/image008.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/proctoru/image008.jpg
--------------------------------------------------------------------------------
/funsite/static/funsite/images/proctoru/image009.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/proctoru/image009.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/proctoru/image010.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/proctoru/image010.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/proctoru/image011.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/proctoru/image011.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/proctoru/image012.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/proctoru/image012.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/proctoru/image013.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/proctoru/image013.png
--------------------------------------------------------------------------------
/funsite/static/funsite/images/proctoru/image014.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/proctoru/image014.jpg
--------------------------------------------------------------------------------
/funsite/static/funsite/images/proctoru/image015.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/proctoru/image015.jpg
--------------------------------------------------------------------------------
/funsite/static/funsite/images/proctoru/image016.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/proctoru/image016.jpg
--------------------------------------------------------------------------------
/funsite/static/funsite/images/proctoru/image017.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/images/proctoru/image017.png
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/.bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "jquery",
3 | "version": "2.1.4",
4 | "main": "dist/jquery.js",
5 | "license": "MIT",
6 | "ignore": [
7 | "**/.*",
8 | "build",
9 | "dist/cdn",
10 | "speed",
11 | "test",
12 | "*.md",
13 | "AUTHORS.txt",
14 | "Gruntfile.js",
15 | "package.json"
16 | ],
17 | "devDependencies": {
18 | "sizzle": "2.1.1-jquery.2.1.2",
19 | "requirejs": "2.1.10",
20 | "qunit": "1.14.0",
21 | "sinon": "1.8.1"
22 | },
23 | "keywords": [
24 | "jquery",
25 | "javascript",
26 | "library"
27 | ],
28 | "homepage": "https://github.com/jquery/jquery",
29 | "_release": "2.1.4",
30 | "_resolution": {
31 | "type": "version",
32 | "tag": "2.1.4",
33 | "commit": "7751e69b615c6eca6f783a81e292a55725af6b85"
34 | },
35 | "_source": "git://github.com/jquery/jquery.git",
36 | "_target": ">= 1.9.1",
37 | "_originalSource": "jquery"
38 | }
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "jquery",
3 | "version": "2.1.4",
4 | "main": "dist/jquery.js",
5 | "license": "MIT",
6 | "ignore": [
7 | "**/.*",
8 | "build",
9 | "dist/cdn",
10 | "speed",
11 | "test",
12 | "*.md",
13 | "AUTHORS.txt",
14 | "Gruntfile.js",
15 | "package.json"
16 | ],
17 | "devDependencies": {
18 | "sizzle": "2.1.1-jquery.2.1.2",
19 | "requirejs": "2.1.10",
20 | "qunit": "1.14.0",
21 | "sinon": "1.8.1"
22 | },
23 | "keywords": [
24 | "jquery",
25 | "javascript",
26 | "library"
27 | ]
28 | }
29 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/ajax/parseJSON.js:
--------------------------------------------------------------------------------
1 | define([
2 | "../core"
3 | ], function( jQuery ) {
4 |
5 | // Support: Android 2.3
6 | // Workaround failure to string-cast null input
7 | jQuery.parseJSON = function( data ) {
8 | return JSON.parse( data + "" );
9 | };
10 |
11 | return jQuery.parseJSON;
12 |
13 | });
14 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/ajax/parseXML.js:
--------------------------------------------------------------------------------
1 | define([
2 | "../core"
3 | ], function( jQuery ) {
4 |
5 | // Cross-browser xml parsing
6 | jQuery.parseXML = function( data ) {
7 | var xml, tmp;
8 | if ( !data || typeof data !== "string" ) {
9 | return null;
10 | }
11 |
12 | // Support: IE9
13 | try {
14 | tmp = new DOMParser();
15 | xml = tmp.parseFromString( data, "text/xml" );
16 | } catch ( e ) {
17 | xml = undefined;
18 | }
19 |
20 | if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
21 | jQuery.error( "Invalid XML: " + data );
22 | }
23 | return xml;
24 | };
25 |
26 | return jQuery.parseXML;
27 |
28 | });
29 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/ajax/var/nonce.js:
--------------------------------------------------------------------------------
1 | define([
2 | "../../core"
3 | ], function( jQuery ) {
4 | return jQuery.now();
5 | });
6 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/ajax/var/rquery.js:
--------------------------------------------------------------------------------
1 | define(function() {
2 | return (/\?/);
3 | });
4 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/attributes.js:
--------------------------------------------------------------------------------
1 | define([
2 | "./core",
3 | "./attributes/attr",
4 | "./attributes/prop",
5 | "./attributes/classes",
6 | "./attributes/val"
7 | ], function( jQuery ) {
8 |
9 | // Return jQuery for attributes-only inclusion
10 | return jQuery;
11 | });
12 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/core/var/rsingleTag.js:
--------------------------------------------------------------------------------
1 | define(function() {
2 | // Match a standalone tag
3 | return (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
4 | });
5 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/css/addGetHookIf.js:
--------------------------------------------------------------------------------
1 | define(function() {
2 |
3 | function addGetHookIf( conditionFn, hookFn ) {
4 | // Define the hook, we'll check on the first run if it's really needed.
5 | return {
6 | get: function() {
7 | if ( conditionFn() ) {
8 | // Hook not needed (or it's not possible to use it due
9 | // to missing dependency), remove it.
10 | delete this.get;
11 | return;
12 | }
13 |
14 | // Hook needed; redefine it so that the support test is not executed again.
15 | return (this.get = hookFn).apply( this, arguments );
16 | }
17 | };
18 | }
19 |
20 | return addGetHookIf;
21 |
22 | });
23 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/css/hiddenVisibleSelectors.js:
--------------------------------------------------------------------------------
1 | define([
2 | "../core",
3 | "../selector"
4 | ], function( jQuery ) {
5 |
6 | jQuery.expr.filters.hidden = function( elem ) {
7 | // Support: Opera <= 12.12
8 | // Opera reports offsetWidths and offsetHeights less than zero on some elements
9 | return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
10 | };
11 | jQuery.expr.filters.visible = function( elem ) {
12 | return !jQuery.expr.filters.hidden( elem );
13 | };
14 |
15 | });
16 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/css/swap.js:
--------------------------------------------------------------------------------
1 | define([
2 | "../core"
3 | ], function( jQuery ) {
4 |
5 | // A method for quickly swapping in/out CSS properties to get correct calculations.
6 | jQuery.swap = function( elem, options, callback, args ) {
7 | var ret, name,
8 | old = {};
9 |
10 | // Remember the old values, and insert the new ones
11 | for ( name in options ) {
12 | old[ name ] = elem.style[ name ];
13 | elem.style[ name ] = options[ name ];
14 | }
15 |
16 | ret = callback.apply( elem, args || [] );
17 |
18 | // Revert the old values
19 | for ( name in options ) {
20 | elem.style[ name ] = old[ name ];
21 | }
22 |
23 | return ret;
24 | };
25 |
26 | return jQuery.swap;
27 |
28 | });
29 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/css/var/cssExpand.js:
--------------------------------------------------------------------------------
1 | define(function() {
2 | return [ "Top", "Right", "Bottom", "Left" ];
3 | });
4 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/css/var/getStyles.js:
--------------------------------------------------------------------------------
1 | define(function() {
2 | return function( elem ) {
3 | // Support: IE<=11+, Firefox<=30+ (#15098, #14150)
4 | // IE throws on elements created in popups
5 | // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6 | if ( elem.ownerDocument.defaultView.opener ) {
7 | return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
8 | }
9 |
10 | return window.getComputedStyle( elem, null );
11 | };
12 | });
13 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/css/var/isHidden.js:
--------------------------------------------------------------------------------
1 | define([
2 | "../../core",
3 | "../../selector"
4 | // css is assumed
5 | ], function( jQuery ) {
6 |
7 | return function( elem, el ) {
8 | // isHidden might be called from jQuery#filter function;
9 | // in that case, element will be second argument
10 | elem = el || elem;
11 | return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
12 | };
13 | });
14 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/css/var/rmargin.js:
--------------------------------------------------------------------------------
1 | define(function() {
2 | return (/^margin/);
3 | });
4 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/css/var/rnumnonpx.js:
--------------------------------------------------------------------------------
1 | define([
2 | "../../var/pnum"
3 | ], function( pnum ) {
4 | return new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
5 | });
6 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/data/accepts.js:
--------------------------------------------------------------------------------
1 | define([
2 | "../core"
3 | ], function( jQuery ) {
4 |
5 | /**
6 | * Determines whether an object can have data
7 | */
8 | jQuery.acceptData = function( owner ) {
9 | // Accepts only:
10 | // - Node
11 | // - Node.ELEMENT_NODE
12 | // - Node.DOCUMENT_NODE
13 | // - Object
14 | // - Any
15 | /* jshint -W018 */
16 | return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
17 | };
18 |
19 | return jQuery.acceptData;
20 | });
21 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/data/var/data_priv.js:
--------------------------------------------------------------------------------
1 | define([
2 | "../Data"
3 | ], function( Data ) {
4 | return new Data();
5 | });
6 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/data/var/data_user.js:
--------------------------------------------------------------------------------
1 | define([
2 | "../Data"
3 | ], function( Data ) {
4 | return new Data();
5 | });
6 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/deprecated.js:
--------------------------------------------------------------------------------
1 | define([
2 | "./core",
3 | "./traversing"
4 | ], function( jQuery ) {
5 |
6 | // The number of elements contained in the matched element set
7 | jQuery.fn.size = function() {
8 | return this.length;
9 | };
10 |
11 | jQuery.fn.andSelf = jQuery.fn.addBack;
12 |
13 | });
14 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/effects/animatedSelector.js:
--------------------------------------------------------------------------------
1 | define([
2 | "../core",
3 | "../selector",
4 | "../effects"
5 | ], function( jQuery ) {
6 |
7 | jQuery.expr.filters.animated = function( elem ) {
8 | return jQuery.grep(jQuery.timers, function( fn ) {
9 | return elem === fn.elem;
10 | }).length;
11 | };
12 |
13 | });
14 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/event/ajax.js:
--------------------------------------------------------------------------------
1 | define([
2 | "../core",
3 | "../event"
4 | ], function( jQuery ) {
5 |
6 | // Attach a bunch of functions for handling common AJAX events
7 | jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
8 | jQuery.fn[ type ] = function( fn ) {
9 | return this.on( type, fn );
10 | };
11 | });
12 |
13 | });
14 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/event/support.js:
--------------------------------------------------------------------------------
1 | define([
2 | "../var/support"
3 | ], function( support ) {
4 |
5 | support.focusinBubbles = "onfocusin" in window;
6 |
7 | return support;
8 |
9 | });
10 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/exports/global.js:
--------------------------------------------------------------------------------
1 | define([
2 | "../core",
3 | "../var/strundefined"
4 | ], function( jQuery, strundefined ) {
5 |
6 | var
7 | // Map over jQuery in case of overwrite
8 | _jQuery = window.jQuery,
9 |
10 | // Map over the $ in case of overwrite
11 | _$ = window.$;
12 |
13 | jQuery.noConflict = function( deep ) {
14 | if ( window.$ === jQuery ) {
15 | window.$ = _$;
16 | }
17 |
18 | if ( deep && window.jQuery === jQuery ) {
19 | window.jQuery = _jQuery;
20 | }
21 |
22 | return jQuery;
23 | };
24 |
25 | // Expose jQuery and $ identifiers, even in AMD
26 | // (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
27 | // and CommonJS for browser emulators (#13566)
28 | if ( typeof noGlobal === strundefined ) {
29 | window.jQuery = window.$ = jQuery;
30 | }
31 |
32 | });
33 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/jquery.js:
--------------------------------------------------------------------------------
1 | define([
2 | "./core",
3 | "./selector",
4 | "./traversing",
5 | "./callbacks",
6 | "./deferred",
7 | "./core/ready",
8 | "./data",
9 | "./queue",
10 | "./queue/delay",
11 | "./attributes",
12 | "./event",
13 | "./event/alias",
14 | "./manipulation",
15 | "./manipulation/_evalUrl",
16 | "./wrap",
17 | "./css",
18 | "./css/hiddenVisibleSelectors",
19 | "./serialize",
20 | "./ajax",
21 | "./ajax/xhr",
22 | "./ajax/script",
23 | "./ajax/jsonp",
24 | "./ajax/load",
25 | "./event/ajax",
26 | "./effects",
27 | "./effects/animatedSelector",
28 | "./offset",
29 | "./dimensions",
30 | "./deprecated",
31 | "./exports/amd",
32 | "./exports/global"
33 | ], function( jQuery ) {
34 |
35 | return jQuery;
36 |
37 | });
38 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/manipulation/_evalUrl.js:
--------------------------------------------------------------------------------
1 | define([
2 | "../ajax"
3 | ], function( jQuery ) {
4 |
5 | jQuery._evalUrl = function( url ) {
6 | return jQuery.ajax({
7 | url: url,
8 | type: "GET",
9 | dataType: "script",
10 | async: false,
11 | global: false,
12 | "throws": true
13 | });
14 | };
15 |
16 | return jQuery._evalUrl;
17 |
18 | });
19 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/manipulation/var/rcheckableType.js:
--------------------------------------------------------------------------------
1 | define(function() {
2 | return (/^(?:checkbox|radio)$/i);
3 | });
4 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/outro.js:
--------------------------------------------------------------------------------
1 | }));
2 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/queue/delay.js:
--------------------------------------------------------------------------------
1 | define([
2 | "../core",
3 | "../queue",
4 | "../effects" // Delay is optional because of this dependency
5 | ], function( jQuery ) {
6 |
7 | // Based off of the plugin by Clint Helfers, with permission.
8 | // http://blindsignals.com/index.php/2009/07/jquery-delay/
9 | jQuery.fn.delay = function( time, type ) {
10 | time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
11 | type = type || "fx";
12 |
13 | return this.queue( type, function( next, hooks ) {
14 | var timeout = setTimeout( next, time );
15 | hooks.stop = function() {
16 | clearTimeout( timeout );
17 | };
18 | });
19 | };
20 |
21 | return jQuery.fn.delay;
22 | });
23 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/selector-sizzle.js:
--------------------------------------------------------------------------------
1 | define([
2 | "./core",
3 | "sizzle"
4 | ], function( jQuery, Sizzle ) {
5 |
6 | jQuery.find = Sizzle;
7 | jQuery.expr = Sizzle.selectors;
8 | jQuery.expr[":"] = jQuery.expr.pseudos;
9 | jQuery.unique = Sizzle.uniqueSort;
10 | jQuery.text = Sizzle.getText;
11 | jQuery.isXMLDoc = Sizzle.isXML;
12 | jQuery.contains = Sizzle.contains;
13 |
14 | });
15 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/selector.js:
--------------------------------------------------------------------------------
1 | define([ "./selector-sizzle" ]);
2 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/traversing/var/rneedsContext.js:
--------------------------------------------------------------------------------
1 | define([
2 | "../../core",
3 | "../../selector"
4 | ], function( jQuery ) {
5 | return jQuery.expr.match.needsContext;
6 | });
7 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/var/arr.js:
--------------------------------------------------------------------------------
1 | define(function() {
2 | return [];
3 | });
4 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/var/class2type.js:
--------------------------------------------------------------------------------
1 | define(function() {
2 | // [[Class]] -> type pairs
3 | return {};
4 | });
5 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/var/concat.js:
--------------------------------------------------------------------------------
1 | define([
2 | "./arr"
3 | ], function( arr ) {
4 | return arr.concat;
5 | });
6 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/var/hasOwn.js:
--------------------------------------------------------------------------------
1 | define([
2 | "./class2type"
3 | ], function( class2type ) {
4 | return class2type.hasOwnProperty;
5 | });
6 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/var/indexOf.js:
--------------------------------------------------------------------------------
1 | define([
2 | "./arr"
3 | ], function( arr ) {
4 | return arr.indexOf;
5 | });
6 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/var/pnum.js:
--------------------------------------------------------------------------------
1 | define(function() {
2 | return (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
3 | });
4 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/var/push.js:
--------------------------------------------------------------------------------
1 | define([
2 | "./arr"
3 | ], function( arr ) {
4 | return arr.push;
5 | });
6 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/var/rnotwhite.js:
--------------------------------------------------------------------------------
1 | define(function() {
2 | return (/\S+/g);
3 | });
4 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/var/slice.js:
--------------------------------------------------------------------------------
1 | define([
2 | "./arr"
3 | ], function( arr ) {
4 | return arr.slice;
5 | });
6 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/var/strundefined.js:
--------------------------------------------------------------------------------
1 | define(function() {
2 | return typeof undefined;
3 | });
4 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/var/support.js:
--------------------------------------------------------------------------------
1 | define(function() {
2 | // All support tests are defined in their respective modules.
3 | return {};
4 | });
5 |
--------------------------------------------------------------------------------
/funsite/static/funsite/jquery/src/var/toString.js:
--------------------------------------------------------------------------------
1 | define([
2 | "./class2type"
3 | ], function( class2type ) {
4 | return class2type.toString;
5 | });
6 |
--------------------------------------------------------------------------------
/funsite/static/funsite/owl.carousel/assets/owl.video.play.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/static/funsite/owl.carousel/assets/owl.video.play.png
--------------------------------------------------------------------------------
/funsite/templates/funsite/parts/base-fixed-width.html:
--------------------------------------------------------------------------------
1 | <%inherit file="/funsite/parts/base.html" />
2 |
3 | <%block name="main_div_class">main-width%block>
--------------------------------------------------------------------------------
/funsite/templates/funsite/parts/base-fluid.html:
--------------------------------------------------------------------------------
1 | <%inherit file="/funsite/parts/base.html" />
2 |
3 | <%block name="main_div_class">%block>
--------------------------------------------------------------------------------
/funsite/templates/funsite/parts/breadcrumbs.html:
--------------------------------------------------------------------------------
1 | ## mako
2 |
3 | <%!
4 | from funsite.utils import breadcrumbs
5 | %>
6 |
7 | <%def name="breadcrumbs(current_page)">
8 |
9 |
10 | % for item in breadcrumbs(request.META['PATH_INFO'], current_page):
11 | ${item.name}
12 | % endfor
13 |
14 |
15 | %def>
16 |
17 |
--------------------------------------------------------------------------------
/funsite/templates/funsite/parts/simple-content.html:
--------------------------------------------------------------------------------
1 | ## mako
2 | <%!
3 | from django.core.urlresolvers import reverse
4 | from django.utils.translation import ugettext as _
5 | %>
6 |
7 | <%inherit file="/funsite/parts/base-fixed-width.html" />
8 |
9 | <%block name="content">
10 |
11 |
12 |
13 |
14 | <%block name="page_content">%block>
15 |
16 |
17 |
18 | %block>
19 |
20 |
--------------------------------------------------------------------------------
/funsite/templates/funsite/static_templates/fun-address.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | GIP FUN-MOOC
5 |
6 |
7 |
8 |
9 | 12 Villa de Lourcine
10 |
11 |
12 |
13 | 75014
14 |
15 |
16 |
17 | Paris
18 |
19 |
20 |
--------------------------------------------------------------------------------
/funsite/templates/funsite/static_templates/searchprovider.xml:
--------------------------------------------------------------------------------
1 | ## mako
2 |
3 | <%!
4 | from django.core.urlresolvers import reverse
5 | from django.utils.translation import ugettext as _
6 | %>
7 |
8 | FUN MOOC
9 | ${_(u"Search courses on FUN")}
10 | UTF-8
11 |
12 |
13 |
--------------------------------------------------------------------------------
/funsite/templates/lms/footer.html:
--------------------------------------------------------------------------------
1 | ## mako
2 |
3 | <%include file="funsite/parts/footer.html" args="base_application='courseware'"/>
4 |
--------------------------------------------------------------------------------
/funsite/templates/lms/navigation.html:
--------------------------------------------------------------------------------
1 | ## mako
2 |
3 | <%include file="funsite/parts/menu.html" args="base_application='courseware'"/>
4 |
--------------------------------------------------------------------------------
/funsite/templates/lms/static_templates/404.html:
--------------------------------------------------------------------------------
1 | <%! from django.utils.translation import ugettext as _ %>
2 | <%inherit file="/funsite/parts/simple-content.html" />
3 |
4 | <%block name="title">${_("Page Not Found")}%block>
5 |
6 | <%block name="page_content">
7 | ${_("Page not found")}
8 | ${_('The page that you were looking for was not found. Go back to the {link_start}homepage{link_end} or let us know about any pages that may have been moved at {email}.').format(
9 | link_start='', link_end=' ', email='{email} '.format(email=settings.TECH_SUPPORT_EMAIL))}
10 | %block>
11 |
--------------------------------------------------------------------------------
/funsite/templates/lms/static_templates/server-error.html:
--------------------------------------------------------------------------------
1 | <%! from django.utils.translation import ugettext as _ %>
2 | <%inherit file="/funsite/parts/simple-content.html" />
3 |
4 | <%block name="title">${_("Server error")}%block>
5 |
6 | <%block name="page_content">
7 | ${_(u"There has been a 500 error on the {platform_name} servers").format(
8 | platform_name=u"{platform_name} ".format(platform_name=settings.PLATFORM_NAME)
9 | )}
10 | ${_(u'Please wait a few seconds and then reload the page. If the problem persists, please email us at {email}.').format(
11 | email=u'{email} '.format(
12 | email=settings.TECH_SUPPORT_EMAIL
13 | )
14 | )}
15 |
16 | %block>
17 |
--------------------------------------------------------------------------------
/funsite/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/funsite/tests/__init__.py
--------------------------------------------------------------------------------
/funsite/tests/test_urls.py:
--------------------------------------------------------------------------------
1 | from django.core.urlresolvers import reverse, resolve
2 | from django.test import TestCase
3 | from django.views.generic import TemplateView
4 |
5 | from fun.tests.utils import skipUnlessLms
6 |
7 |
8 | @skipUnlessLms
9 | class TestStaticUrl(TestCase):
10 | def test_static_url(self):
11 | url_reversed = reverse('tos')
12 | self.assertEqual(url_reversed, '/tos')
13 | view = resolve(url_reversed)
14 | # TODO Dogwood: find out
15 | #self.assertEqual(view.func, TemplateView.as_view)
16 |
--------------------------------------------------------------------------------
/funsite/views.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | from django.shortcuts import render
4 |
5 | from edxmako.shortcuts import render_to_response
6 |
7 |
8 | def index(request):
9 | """A simple view to override edX's home page."""
10 | return render_to_response("index.html")
11 |
12 |
13 | def render_static_template(request, page):
14 | return render(request, "funsite/static_templates/%s.html" % page, {})
15 |
--------------------------------------------------------------------------------
/grades_api/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/grades_api/__init__.py
--------------------------------------------------------------------------------
/grades_api/urls.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from django.conf import settings
3 | from django.conf.urls import patterns, url
4 |
5 | urlpatterns = patterns(
6 | "grades_api.api",
7 | url(r'^{}/(?P[\w.+-]+)/$'.format(settings.COURSE_KEY_PATTERN), 'get_student_course_grade', name="student_grade")
8 | )
--------------------------------------------------------------------------------
/mailing_list/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/mailing_list/__init__.py
--------------------------------------------------------------------------------
/mailing_list/locale/fr/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/mailing_list/locale/fr/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/mailing_list/urls.py:
--------------------------------------------------------------------------------
1 | from django.conf.urls import url
2 |
3 | from . import views
4 |
5 | urlpatterns = [
6 | url(r'^subscribe/$', views.subscribe, name='subscribe'),
7 | url(r'^unsubscribe/$', views.unsubscribe, name='unsubscribe'),
8 | ]
9 |
--------------------------------------------------------------------------------
/newsfeed/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/newsfeed/__init__.py
--------------------------------------------------------------------------------
/newsfeed/locale/fr/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/newsfeed/locale/fr/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/newsfeed/migrations/0002_auto_20161011_1724.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('newsfeed', '0001_initial'),
11 | ]
12 |
13 | operations = [
14 | migrations.AlterField(
15 | model_name='article',
16 | name='courses',
17 | field=models.ManyToManyField(related_name='articles', verbose_name='courses', to='courses.Course', blank=True),
18 | ),
19 | ]
20 |
--------------------------------------------------------------------------------
/newsfeed/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/newsfeed/migrations/__init__.py
--------------------------------------------------------------------------------
/newsfeed/templates/admin/solo/change_form.html:
--------------------------------------------------------------------------------
1 | {% extends "admin/change_form.html" %}
2 | {% load i18n %}
3 | {% load admin_urls %}
4 | {% load url from future %}
5 |
6 | {% block breadcrumbs %}
7 |
12 | {% endblock %}
13 |
14 | {% block object-tools-items %}
15 | {% trans "History" %}
16 | {% if has_absolute_url %}{% trans "View on site" %} {% endif%}
17 | {% endblock %}
18 |
--------------------------------------------------------------------------------
/newsfeed/templates/admin/solo/object_history.html:
--------------------------------------------------------------------------------
1 | {% extends "admin/object_history.html" %}
2 | {% load i18n %}
3 | {% load url from future %}
4 |
5 | {% block breadcrumbs %}
6 |
13 | {% endblock %}
14 |
15 |
16 |
--------------------------------------------------------------------------------
/newsfeed/templates/newsfeed/change_form.html:
--------------------------------------------------------------------------------
1 | {% extends "admin/change_form.html" %}
2 | {% load i18n %}
3 | {% block after_related_objects %}
4 | {% with slug=adminform.form.slug.value %}
5 | {% if slug %}
6 | {% trans "Preview" %}
7 | {% trans "Preview news page" %}
8 | {% endif %}
9 | {% endwith %}
10 | {% endblock %}
11 |
--------------------------------------------------------------------------------
/newsfeed/templates/newsfeed/feed/feed.html:
--------------------------------------------------------------------------------
1 | ## mako
2 | <%!
3 | from django.utils.translation import ugettext as _
4 | %>
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | ${article.get_lead_paragraph()}
17 |
18 |
19 |
20 |
21 | ${article.text}
22 |
23 |
--------------------------------------------------------------------------------
/newsfeed/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/newsfeed/tests/__init__.py
--------------------------------------------------------------------------------
/newsfeed/tests/factories.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | import datetime
4 | import factory
5 |
6 | from newsfeed import models
7 |
8 |
9 | class ArticleCategoryFactory(factory.DjangoModelFactory):
10 | slug = factory.Sequence(lambda n: 'category-{0}'.format(n))
11 |
12 | class Meta(object):
13 | model = models.ArticleCategory
14 |
15 |
16 | class ArticleFactory(factory.DjangoModelFactory):
17 | # the number can't be at the end, otherwise, "news1" is in "news10"
18 | title = factory.Sequence(lambda n: u"-- An awesome piece of news n° {} --".format(n))
19 | slug = factory.Sequence(lambda n: 'a-great-slug-{0}'.format(n))
20 | text = u"J'étais un texte accentué !"
21 | created_at = factory.lazy_attribute(lambda x: datetime.datetime.now())
22 | category = None
23 |
24 | class Meta(object):
25 | model = models.Article
26 |
--------------------------------------------------------------------------------
/newsfeed/urls.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | from django.conf.urls import url, patterns
4 |
5 | from .views import NewsFeed
6 |
7 | urlpatterns = patterns('newsfeed.views',
8 | url(r'^$', 'article_list', name='newsfeed-landing'),
9 | url(r'^feed/$', NewsFeed(), name='newsfeed-rss'),
10 | url(r'^preview/(?P[-\w]+)/$', 'article_list_preview', name='newsfeed-landing-preview'),
11 | url(r'^article/preview/(?P[-\w]+)/$', 'article_preview', name='newsfeed-article-preview'),
12 | url(r'^(?P[-\w]+)/$', 'article_detail', name='newsfeed-article'),
13 | )
14 |
15 | urlpatterns += patterns('newsfeed.views_ckeditor',
16 | url(r'^ckeditor/upload/$', 'ckeditor_upload', name='news-ckeditor-upload'),
17 | url(r'^ckeditor/browse/$', 'ckeditor_browse', name='news-ckeditor-browse'),
18 | )
19 |
--------------------------------------------------------------------------------
/newsfeed/views_ckeditor.py:
--------------------------------------------------------------------------------
1 | import os
2 |
3 | from django.conf import settings
4 | from django.test.utils import override_settings
5 | from django.views.decorators.csrf import csrf_exempt
6 |
7 | import ckeditor.views
8 |
9 |
10 | @csrf_exempt
11 | def ckeditor_upload(request):
12 | with override_settings(CKEDITOR_UPLOAD_PATH=get_upload_path()):
13 | return ckeditor.views.upload(request)
14 |
15 |
16 | def ckeditor_browse(request):
17 | with override_settings(CKEDITOR_UPLOAD_PATH=get_upload_path()):
18 | return ckeditor.views.browse(request)
19 |
20 |
21 | def get_upload_path():
22 | return os.path.join(settings.CKEDITOR_UPLOAD_PATH, "news")
23 |
--------------------------------------------------------------------------------
/payment/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/payment/__init__.py
--------------------------------------------------------------------------------
/payment/locale/fr/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/payment/locale/fr/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/payment/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/payment/migrations/__init__.py
--------------------------------------------------------------------------------
/payment/static/payment/css/order.css:
--------------------------------------------------------------------------------
1 | /* Change the table border color for the bill without changing bill.html */
2 | td{
3 | border-color: #ddd!important;
4 | }
5 |
6 | .print-logo{
7 | margin-bottom: 5em;
8 | }
9 |
10 | .print-logo > .row > .image img {
11 | width:130px;
12 | height: auto;
13 | }
14 |
15 | @media print {
16 | #top-menu, .fun-footer, .breadcrumbs {
17 | display: none !important;
18 | }
19 | }
20 |
21 | .image-course {
22 | width:160px;
23 | height: auto;
24 | }
25 |
26 | .vcenter {
27 | display: inline-block;
28 | vertical-align: middle;
29 | float: none;
30 | }
31 |
32 | .debug{
33 | border: 1px solid black ;
34 | }
35 |
36 | .clear-space{
37 | margin-bottom: 2em;
38 | }
39 |
--------------------------------------------------------------------------------
/payment/templates/payment/base-abstract.html:
--------------------------------------------------------------------------------
1 | ## mako
2 | <%!
3 | from django.core.urlresolvers import reverse
4 | from django.utils.translation import ugettext as _
5 |
6 | %>
7 |
8 | <%inherit file="/funsite/parts/simple-content.html" />
9 |
10 | <%namespace name="breadcrumbs" file="/funsite/parts/breadcrumbs.html"/>
11 |
12 |
13 |
14 | <%block name="page_content">
15 |
16 |
21 |
22 | <%block name="columns">
23 | %block>
24 |
25 |
28 | %block>
29 |
30 |
31 |
--------------------------------------------------------------------------------
/payment/templates/payment/base.html:
--------------------------------------------------------------------------------
1 | ## mako
2 | <%!
3 | from django.core.urlresolvers import reverse
4 | from django.utils.translation import ugettext as _
5 |
6 | %>
7 |
8 | <%inherit file="/payment/base-abstract.html" />
9 |
10 |
11 | <%block name="columns">
12 |
13 |
14 | <%block name="message">%block>
15 |
16 |
17 |
18 |
19 | %block>
20 |
21 |
22 |
--------------------------------------------------------------------------------
/payment/templates/payment/base_large.html:
--------------------------------------------------------------------------------
1 | ## mako
2 | <%!
3 | from django.core.urlresolvers import reverse
4 | from django.utils.translation import ugettext as _
5 |
6 | %>
7 |
8 | <%inherit file="/payment/base-abstract.html" />
9 |
10 |
11 | <%block name="columns">
12 |
13 | <%block name="message">%block>
14 |
15 | %block>
16 |
17 |
18 |
--------------------------------------------------------------------------------
/payment/templates/payment/cancel.html:
--------------------------------------------------------------------------------
1 | ## mako
2 | <%!
3 | from django.utils.translation import ugettext as _
4 | %>
5 |
6 | <%inherit file="/payment/base.html" />
7 |
8 |
9 | <%block name="title">${_(u"Payment canceled")}%block>
10 | <%block name="breadcrumb_current_page">${_(u"Payment canceled")}%block>
11 |
12 | <%block name="message">
13 | ${_(u"Payment canceled")}
14 |
15 |
16 | ${_(u"Payment order for the course has been interrupted.")}
17 |
18 |
19 | ${_(u"Your payment of {total} € for the course {title} failed.").format(
20 | total=total_excl_tax, title=basket_course.title)}
21 |
22 |
23 |
24 | ${_(u"This was for the payment order {number} .").format(number=order_number)}
25 |
26 |
27 | %block>
--------------------------------------------------------------------------------
/payment/templates/payment/email/confirmation-email.txt:
--------------------------------------------------------------------------------
1 | ## mako
2 |
3 | Le réglement de ${order['total_excl_tax']} € HT pour votre inscription au cours ${ordered_course.title} a bien été pris en compte.
4 |
5 | TVA non applicable, Exonération Art. 261-4-4 du CGI.
--------------------------------------------------------------------------------
/payment/templates/payment/error.html:
--------------------------------------------------------------------------------
1 | ## mako
2 | <%!
3 | from django.utils.translation import ugettext as _
4 | %>
5 |
6 | <%inherit file="/payment/base.html" />
7 |
8 |
9 | <%block name="title">${_(u"An error has occurred")}%block>
10 | <%block name="breadcrumb_current_page">${_(u"An error has occurred")}%block>
11 |
12 | <%block name="message">
13 | ${_(u"An error has occurred")}
14 |
15 |
16 | ${_(u"An error has occurred while processing your payment for the course.")}
17 |
18 |
19 | ${_(u"Your payment of {total} € for the course {title} failed.").format(total=total_excl_tax, title=basket_course.title)}
20 |
21 |
22 | ${_(u"This was for the payment order {number} .").format(number=order_number)}
23 |
24 |
25 | ${_(u"Error code {errorcode} .").format(errorcode=errorcode)}
26 |
27 |
28 |
29 |
30 | %block>
--------------------------------------------------------------------------------
/payment/templates/payment/success.html:
--------------------------------------------------------------------------------
1 | ## mako
2 | <%!
3 | from django.utils.translation import ugettext as _
4 | %>
5 |
6 | <%inherit file="/payment/base.html" />
7 |
8 |
9 | <%block name="title">${_(u"Payment successful")}%block>
10 | <%block name="breadcrumb_current_page">${_(u"Payment successful")}%block>
11 |
12 | <%block name="message">
13 | ${_(u"Payment successful")}
14 |
15 |
16 | ${_(u"Your payment of {total} € for the course {title} has been processed.").format(total=order['total_excl_tax'], title=ordered_course.title)}
17 |
18 |
19 | ${_(u"This is for the payment order {number} .").format(number=order['number'])}
20 |
21 |
22 | %block>
23 |
--------------------------------------------------------------------------------
/payment/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/payment/tests/__init__.py
--------------------------------------------------------------------------------
/payment/tests/factories.py:
--------------------------------------------------------------------------------
1 | import factory
2 | from factory import fuzzy
3 |
4 | from ..models import TermsAndConditions, TranslatedTerms
5 |
6 |
7 | class TranslatedTermsFactory(factory.DjangoModelFactory):
8 |
9 | tr_text = fuzzy.FuzzyText(length=255)
10 | language = 'fr'
11 |
12 | class Meta(object):
13 | model = TranslatedTerms
14 |
15 |
16 | class TermsAndConditionsFactory(factory.DjangoModelFactory):
17 | name = name = fuzzy.FuzzyText(length=20)
18 | version = factory.Sequence("{0}".format)
19 | text = fuzzy.FuzzyText(length=255)
20 |
21 | translated_terms = factory.RelatedFactory(TranslatedTermsFactory, 'term')
22 |
23 | class Meta(object):
24 | model = TermsAndConditions
25 |
--------------------------------------------------------------------------------
/payment/urls.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | from django.conf.urls import url, patterns
4 |
5 | # this url file is namespaced 'payment'
6 |
7 | urlpatterns = patterns('payment.views',
8 | url(r'^success/$', 'paybox_success', name="success"),
9 | url(r'^cancel/$', 'paybox_cancel', name="cancel"),
10 | url(r'^error/$', 'paybox_error', name="error"),
11 | url(r'^receipt/$', 'list_receipts', name="list-receipts"),
12 | url(r'^receipt/(?P\w*\-\d*)/$', 'detail_receipt', name="detail-receipt"),
13 |
14 | url(r'^terms(?:/(?P(agreement)))?/$', 'payment_terms_page', name="terms-page"),
15 | url(r'^terms/get/$', 'get_payment_terms', name="get-terms"),
16 | url(r'^terms/accept/$', 'accept_payment_terms', name="accept-terms"),
17 | )
18 |
--------------------------------------------------------------------------------
/payment_api/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/payment_api/__init__.py
--------------------------------------------------------------------------------
/payment_api/models.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/payment_api/models.py
--------------------------------------------------------------------------------
/payment_api/serializers.py:
--------------------------------------------------------------------------------
1 | from rest_framework import serializers
2 |
3 |
4 | class PaymentNotificationSerializer(serializers.Serializer):
5 | username = serializers.CharField(required=True)
6 | email = serializers.CharField(required=True)
7 | order_number = serializers.CharField(required=True)
8 |
--------------------------------------------------------------------------------
/payment_api/urls.py:
--------------------------------------------------------------------------------
1 | from django.conf.urls import patterns, url
2 |
3 |
4 | urlpatterns = patterns('payment_api.views',
5 | url(r'^notification/$', 'payment_notification', name='payment-notification'),
6 | )
7 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | -e .[dev]
2 |
--------------------------------------------------------------------------------
/requirements/dev.txt:
--------------------------------------------------------------------------------
1 | git+https://github.com/openfun/fun-cmd.git@090f63fadb5fd6b2e76273eb4793820c0d0d27bb#egg=fun-cmd
2 | pylint==1.5.4
3 |
4 | # Override Openedx requirement to bump version fixing extraction for underscore template
5 | django-babel-underscore==0.5.2
6 |
--------------------------------------------------------------------------------
/requirements/ipython-xblock.txt:
--------------------------------------------------------------------------------
1 | -e git+https://github.com/openfun/xblock-ipython.git@920082ac5015d2c72899b77959e793c1c7ab2d54#egg=ipython-xblock
2 |
--------------------------------------------------------------------------------
/requirements/private.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/requirements/private.txt
--------------------------------------------------------------------------------
/scripts/entrypoint.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | #
3 | # Development entrypoint
4 | #
5 |
6 | # Activate user's virtualenv
7 | source /edx/app/edxapp/venv/bin/activate
8 | exec "$@"
9 |
--------------------------------------------------------------------------------
/setup.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | from setuptools import setup
4 |
5 | setup()
6 |
--------------------------------------------------------------------------------
/teachers/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/teachers/__init__.py
--------------------------------------------------------------------------------
/teachers/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/teachers/migrations/__init__.py
--------------------------------------------------------------------------------
/universities/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/universities/__init__.py
--------------------------------------------------------------------------------
/universities/choices.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | from django.utils.translation import ugettext_lazy as _
4 |
5 |
6 | PARTNER_LEVEL_SIMPLE = 'simple-partner'
7 | PARTNER_LEVEL_ACADEMIC = 'academic-partner'
8 | PARTNER_LEVEL_1 = 'level-1'
9 | PARTNER_LEVEL_2 = 'level-2'
10 | PARTNER_LEVEL_3 = 'level-3'
11 |
12 | UNIVERSITY_PARTNERSHIP_LEVEL = (
13 | (PARTNER_LEVEL_SIMPLE, _('Partner')),
14 | (PARTNER_LEVEL_ACADEMIC, _('Academic Partner')),
15 | (PARTNER_LEVEL_1, _('Level 1')),
16 | (PARTNER_LEVEL_2, _('Level 2')),
17 | (PARTNER_LEVEL_3, _('Level 3')),
18 | )
19 |
--------------------------------------------------------------------------------
/universities/ckeditor_settings.py:
--------------------------------------------------------------------------------
1 | CKEDITOR_CONFIGS = {
2 | 'default': {
3 | 'toolbar': [
4 | ['Undo', 'Redo'],
5 | ['Bold', 'Italic', 'Underline'],
6 | ['Format'],
7 | ['Link'],
8 | ['BulletedList', 'NumberedList', '-', 'Source'],
9 | ],
10 | 'toolbarCanCollapse': False,
11 | 'entities': False,
12 | 'width': 955,
13 | 'uiColor': '#9AB8F3',
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/universities/locale/fr/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/universities/locale/fr/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/universities/managers.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from django.db import models
3 |
4 |
5 | class UniversityQuerySet(models.query.QuerySet):
6 |
7 | def not_obsolete(self):
8 | return self.filter(is_obsolete=False)
9 |
10 | def detail_page_enabled(self):
11 | return self.filter(detail_page_enabled=True)
12 |
13 | def with_related(self):
14 | queryset = self.prefetch_related('courses')
15 | return queryset
16 |
17 | def by_score(self):
18 | return self.order_by('-score', 'name')
19 |
20 | def featured(self, limit_to=None):
21 | """Featured universities have a detail page and are not obsolete"""
22 | qs = self.not_obsolete().detail_page_enabled().with_related().by_score()
23 | if limit_to is not None:
24 | qs = qs[:limit_to]
25 | return qs
26 |
--------------------------------------------------------------------------------
/universities/migrations/0002_auto_20191016_0452.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('universities', '0001_initial'),
11 | ]
12 |
13 | operations = [
14 | migrations.AlterModelOptions(
15 | name='university',
16 | options={'ordering': ('-score', 'id'), 'verbose_name': 'University', 'verbose_name_plural': 'Universities'},
17 | ),
18 | ]
19 |
--------------------------------------------------------------------------------
/universities/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/universities/migrations/__init__.py
--------------------------------------------------------------------------------
/universities/serializers.py:
--------------------------------------------------------------------------------
1 |
2 | from rest_framework import serializers
3 |
4 | from fun_api import serializers as fun_serializers
5 | from universities.models import University
6 |
7 |
8 | class UniversitySerializer(serializers.ModelSerializer):
9 |
10 | class Meta:
11 | model = University
12 | fields = (
13 | 'id', 'name', 'code', 'logo', 'banner')
14 |
15 |
16 | class UniversityStaffSerializer(fun_serializers.UpdateSerializerMixin, UniversitySerializer):
17 | """
18 | Presents data accessible to authenticated staff users.
19 | """
20 |
21 | class Meta(UniversitySerializer.Meta):
22 | fields = UniversitySerializer.Meta.fields + (
23 | 'score', 'partnership_level', 'prevent_auto_update')
24 | # All fields are readonly except "score"
25 | read_only_fields = UniversitySerializer.Meta.fields + (
26 | 'partnership_level', 'prevent_auto_update')
27 |
--------------------------------------------------------------------------------
/universities/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/universities/tests/__init__.py
--------------------------------------------------------------------------------
/universities/urls.py:
--------------------------------------------------------------------------------
1 |
2 | from django.conf.urls import include, patterns, url
3 |
4 | from rest_framework.routers import DefaultRouter
5 |
6 | from .api import UniversityAPIViewSet
7 |
8 |
9 | urlpatterns = patterns(
10 | 'universities.views',
11 | url(r'^$', 'university_landing', name='universities-landing'),
12 | url(r'^(?P[-\w]+)/$', 'university_detail', name='universities-detail'),
13 | )
14 |
15 | router = DefaultRouter()
16 | router.register(r'api/universities', UniversityAPIViewSet, base_name='universities_api')
17 | urlpatterns += [
18 | url(r'^', include(router.urls))]
19 |
--------------------------------------------------------------------------------
/universities/views.py:
--------------------------------------------------------------------------------
1 | from django.views.generic import ListView, DetailView
2 |
3 | from fun.utils import mako
4 |
5 | from universities.models import University
6 |
7 |
8 | class UniversityLandingView(mako.MakoTemplateMixin, ListView):
9 | template_name = 'universities/index.html'
10 | context_object_name = 'universities'
11 |
12 | def get_queryset(self):
13 | return University.objects.featured()
14 |
15 |
16 | class UniversityDetailView(mako.MakoTemplateMixin, DetailView):
17 | template_name = 'universities/detail.html'
18 | context_object_name = 'university'
19 |
20 | def get_queryset(self):
21 | return University.objects.not_obsolete().with_related()
22 |
23 | def get_context_data(self, **kwargs):
24 | context = super(UniversityDetailView, self).get_context_data(**kwargs)
25 | context['courses'] = self.object.courses.public()
26 | return context
27 |
28 |
29 | university_landing = UniversityLandingView.as_view()
30 | university_detail = UniversityDetailView.as_view()
31 |
--------------------------------------------------------------------------------
/videoproviders/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/videoproviders/__init__.py
--------------------------------------------------------------------------------
/videoproviders/api/__init__.py:
--------------------------------------------------------------------------------
1 | import importlib
2 |
3 | from .base import MissingCredentials, ClientError
4 |
5 |
6 | VIDEO_CLIENT_MODULE = "videoproviders.api.videofront"
7 | VIDEO_CLIENT_CLASS = "Client"
8 |
9 |
10 | def get_client(course_key_string):
11 | """Return the API client most appropriate for this course
12 |
13 | Return:
14 | client: instance of a BaseClient child class.
15 | """
16 | module = importlib.import_module(VIDEO_CLIENT_MODULE)
17 | return getattr(module, VIDEO_CLIENT_CLASS)(course_key_string)
18 |
--------------------------------------------------------------------------------
/videoproviders/locale/fr/LC_MESSAGES/django.mo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/videoproviders/locale/fr/LC_MESSAGES/django.mo
--------------------------------------------------------------------------------
/videoproviders/management/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/videoproviders/management/__init__.py
--------------------------------------------------------------------------------
/videoproviders/management/commands/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/videoproviders/management/commands/__init__.py
--------------------------------------------------------------------------------
/videoproviders/migrations/0003_explicitely_set_is_youtube_video_xblock_attribute.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('videoproviders', '0002_videouploaderdeactivationperiod_youtubeauth_youtubecoursesettings'),
11 | ]
12 |
13 | operations = [
14 | ]
15 |
--------------------------------------------------------------------------------
/videoproviders/migrations/0004_del_libcast.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('videoproviders', '0003_explicitely_set_is_youtube_video_xblock_attribute'),
11 | ]
12 |
13 | operations = [
14 | migrations.RemoveField(
15 | model_name='libcastauth',
16 | name='university',
17 | ),
18 | migrations.DeleteModel(
19 | name='LibcastCourseSettings',
20 | ),
21 | migrations.DeleteModel(
22 | name='LibcastAuth',
23 | ),
24 | ]
25 |
--------------------------------------------------------------------------------
/videoproviders/migrations/0006_explicitely_set_is_youtube_video_xblock_attribute.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('videoproviders', '0005_videofrontauth_videofrontcoursesettings'),
11 | ]
12 |
13 | operations = [
14 | ]
15 |
--------------------------------------------------------------------------------
/videoproviders/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/videoproviders/migrations/__init__.py
--------------------------------------------------------------------------------
/videoproviders/patterns.py:
--------------------------------------------------------------------------------
1 | # Regular expressions that match the resource ids; useful for url pattern
2 | # matching.
3 | VIDEO_ID_PATTERN = r'[a-zA-Z0-9.\-_]+'
4 | SUBTITLE_ID_PATTERN = r'[a-zA-Z0-9.\-_=]+'
5 |
--------------------------------------------------------------------------------
/videoproviders/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openfun/fun-apps/2215bef7af1a4fbe353213a0ccf5334e401ec27b/videoproviders/tests/__init__.py
--------------------------------------------------------------------------------
/videoproviders/tests/fixtures/__init__.py:
--------------------------------------------------------------------------------
1 | import json
2 | import os
3 |
4 | def get_json_content(file_name):
5 | with open(os.path.join(os.path.dirname(__file__), file_name)) as f:
6 | return json.load(f)
7 |
8 | def get_content(file_name):
9 | """Read the content of the fixtures file stored in the current folder.
10 |
11 | Returns:
12 | unicode: file content
13 | """
14 | with open(os.path.join(os.path.dirname(__file__), file_name)) as f:
15 | return f.read().decode('utf-8')
16 |
--------------------------------------------------------------------------------
/videoproviders/tests/fixtures/sub.fr.srt:
--------------------------------------------------------------------------------
1 | 1
2 | 00:00:00,140 --> 00:00:03,820
3 | Bonjour à tous
4 |
5 | 2
6 | 00:00:06,800 --> 00:00:07,640
7 | Ce film s'annonce fantastique.
8 |
9 | 3
10 | 00:00:08,220 --> 00:00:11,640
11 | Han shot first.
12 |
--------------------------------------------------------------------------------
/videoproviders/tests/fixtures/sub.fr.vtt:
--------------------------------------------------------------------------------
1 | WEBVTT
2 |
3 | 00:00.140 --> 00:03.820
4 | Bonjour à tous
5 |
6 | 00:06.800 --> 00:07.640
7 | Ce film s'annonce fantastique.
8 |
9 | 00:08.220 --> 00:11.640
10 | Han shot first.
11 |
12 |
--------------------------------------------------------------------------------
/videoproviders/tests/fixtures/videofront/playlist_created.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "playlistid",
3 | "name": "playlist name"
4 | }
5 |
--------------------------------------------------------------------------------