├── .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 | 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 | 16 | 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 | 15 |

16 | {% endblock %} 17 | 18 | {% block modal-button %} 19 | 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 | 9 | 10 | <%block name="header"> 11 |

${_("Platform statistics")}

12 | 13 | 14 | <%block name="navigation"> 15 | 19 | 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 | 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 | 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 | 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 | 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 | 7 | 8 | <%block name="extra_footer"> 9 | <%include file="student-map-footer.html"/> 10 | 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 | 7 | 8 | <%block name="extra_footer"> 9 | <%include file="student-map-footer.html"/> 10 | 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 | 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 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
<%- gettext("Preview") %> <%- gettext("Title") %> <%- gettext("Created at") %>ID<%- gettext("Status") %><%- gettext("Actions") %>
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 | 7 | -------------------------------------------------------------------------------- /fun/templates/cms/videoupload/js/parameters.underscore: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /funsite/templates/funsite/parts/base-fluid.html: -------------------------------------------------------------------------------- 1 | <%inherit file="/funsite/parts/base.html" /> 2 | 3 | <%block name="main_div_class"> -------------------------------------------------------------------------------- /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 | 15 | 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"> 15 |
    16 |
    17 |
    18 | 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")} 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 | 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")} 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 | 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 |

    ${article.title}

    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 | 24 | 25 | 28 | 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"> 15 | 16 |
    17 | 18 | 19 | 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"> 14 |
    15 | 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")} 10 | <%block name="breadcrumb_current_page">${_(u"Payment canceled")} 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 | -------------------------------------------------------------------------------- /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")} 10 | <%block name="breadcrumb_current_page">${_(u"An error has occurred")} 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 | -------------------------------------------------------------------------------- /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")} 10 | <%block name="breadcrumb_current_page">${_(u"Payment successful")} 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 | 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 | --------------------------------------------------------------------------------