diff --git a/common/templates/course_modes/choose.html b/common/templates/course_modes/choose.html new file mode 100644 index 0000000000..6a12b02cfc --- /dev/null +++ b/common/templates/course_modes/choose.html @@ -0,0 +1,23 @@ +<%! from django.utils.translation import ugettext as _ %> +<%! from django.core.urlresolvers import reverse %> +<%inherit file="../main.html" /> + +<%block name="content"> + +
+ % if "audit" in modes: +
+ +
+
+ % endif + + % if "verified" in modes: +
+ +
+ % endif + +
+ + diff --git a/lms/djangoapps/verify_student/migrations/0001_initial.py b/lms/djangoapps/verify_student/migrations/0001_initial.py new file mode 100644 index 0000000000..65ffafc49b --- /dev/null +++ b/lms/djangoapps/verify_student/migrations/0001_initial.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'SoftwareSecurePhotoVerification' + db.create_table('verify_student_softwaresecurephotoverification', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('status', self.gf('model_utils.fields.StatusField')(default='created', max_length=100, no_check_for_status=True)), + ('status_changed', self.gf('model_utils.fields.MonitorField')(default=datetime.datetime.now, monitor=u'status')), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + ('name', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)), + ('face_image_url', self.gf('django.db.models.fields.URLField')(max_length=255, blank=True)), + ('photo_id_image_url', self.gf('django.db.models.fields.URLField')(max_length=255, blank=True)), + ('receipt_id', self.gf('django.db.models.fields.CharField')(max_length=255, db_index=True)), + ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, db_index=True, blank=True)), + ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, db_index=True, blank=True)), + ('submitted_at', self.gf('django.db.models.fields.DateTimeField')(null=True, db_index=True)), + ('reviewing_user', self.gf('django.db.models.fields.related.ForeignKey')(default=None, related_name='photo_verifications_reviewed', null=True, to=orm['auth.User'])), + ('reviewing_service', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)), + ('error_msg', self.gf('django.db.models.fields.TextField')(blank=True)), + ('error_code', self.gf('django.db.models.fields.CharField')(max_length=50, blank=True)), + ('photo_id_key', self.gf('django.db.models.fields.TextField')(max_length=1024)), + )) + db.send_create_signal('verify_student', ['SoftwareSecurePhotoVerification']) + + + def backwards(self, orm): + # Deleting model 'SoftwareSecurePhotoVerification' + db.delete_table('verify_student_softwaresecurephotoverification') + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'verify_student.softwaresecurephotoverification': { + 'Meta': {'ordering': "['-created_at']", 'object_name': 'SoftwareSecurePhotoVerification'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + 'error_code': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), + 'error_msg': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'face_image_url': ('django.db.models.fields.URLField', [], {'max_length': '255', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'photo_id_image_url': ('django.db.models.fields.URLField', [], {'max_length': '255', 'blank': 'True'}), + 'photo_id_key': ('django.db.models.fields.TextField', [], {'max_length': '1024'}), + 'receipt_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'reviewing_service': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'reviewing_user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'photo_verifications_reviewed'", 'null': 'True', 'to': "orm['auth.User']"}), + 'status': ('model_utils.fields.StatusField', [], {'default': "'created'", 'max_length': '100', u'no_check_for_status': 'True'}), + 'status_changed': ('model_utils.fields.MonitorField', [], {'default': 'datetime.datetime.now', u'monitor': "u'status'"}), + 'submitted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'db_index': 'True'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + } + } + + complete_apps = ['verify_student'] \ No newline at end of file diff --git a/lms/static/js/vendor/responsive-carousel/responsive-carousel.js b/lms/static/js/vendor/responsive-carousel/responsive-carousel.js new file mode 100644 index 0000000000..2c421a14e8 --- /dev/null +++ b/lms/static/js/vendor/responsive-carousel/responsive-carousel.js @@ -0,0 +1,4 @@ +/*! Responsive Carousel - v0.1.0 - 2013-07-15 +* https://github.com/filamentgroup/responsive-carousel +* Copyright (c) 2013 Filament Group, Inc.; Licensed MIT, GPL */ +(function(e){var t="carousel",n="."+t,r="data-transition",i=t+"-transitioning",s=t+"-item",o=t+"-active",u=t+"-item-prev",a=t+"-item-next",f=t+"-in",l=t+"-out",c=t+"-nav",h=function(){var e="webkit Moz O Ms".split(" "),t=!1,n;while(e.length){n=e.shift()+"Transition";if(n in document.documentElement.style!==undefined&&n in document.documentElement.style!=0){t=!0;break}}return t}(),p={_create:function(){e(this).trigger("beforecreate."+t)[t]("_init")[t]("_addNextPrev").trigger("create."+t)},_init:function(){var n=e(this).attr(r);n||(h=!1),e(this).addClass(t+" "+(n?t+"-"+n:"")+" ").children().addClass(s).first().addClass(o),e(this)[t]("_addNextPrevClasses")},_addNextPrevClasses:function(){var t=e(this).find("."+s),n=t.filter("."+o),r=n.next("."+s),i=n.prev("."+s);r.length||(r=t.first().not("."+o)),i.length||(i=t.last().not("."+o)),t.removeClass(u+" "+a),i.addClass(u),r.addClass(a)},next:function(){e(this)[t]("goTo","+1")},prev:function(){e(this)[t]("goTo","-1")},goTo:function(n){var i=e(this),u=i.attr(r),a=" "+t+"-"+u+"-reverse";e(this).find("."+s).removeClass([l,f,a].join(" "));var c=e(this).find("."+o),p=c.index(),d=(p<0?0:p)+1,v=typeof n=="number"?n:d+parseFloat(n),m=e(this).find(".carousel-item").eq(v-1),g=typeof n=="string"&&!parseFloat(n)||v>d?"":a;m.length||(m=e(this).find("."+s)[g.length?"last":"first"]()),h?i[t]("_transitionStart",c,m,g):(m.addClass(o),i[t]("_transitionEnd",c,m,g)),i.trigger("goto."+t,m)},update:function(){return e(this).children().not("."+c).addClass(s),e(this).trigger("update."+t)},_transitionStart:function(n,r,i){var s=e(this);r.one(navigator.userAgent.indexOf("AppleWebKit")>-1?"webkitTransitionEnd":"transitionend otransitionend",function(){s[t]("_transitionEnd",n,r,i)}),e(this).addClass(i),n.addClass(l),r.addClass(f)},_transitionEnd:function(n,r,i){e(this).removeClass(i),n.removeClass(l+" "+o),r.removeClass(f).addClass(o),e(this)[t]("_addNextPrevClasses")},_bindEventListeners:function(){var n=e(this).bind("click",function(r){var i=e(r.target).closest("a[href='#next'],a[href='#prev']");i.length&&(n[t](i.is("[href='#next']")?"next":"prev"),r.preventDefault())});return this},_addNextPrev:function(){return e(this).append("")[t]("_bindEventListeners")},destroy:function(){}};e.fn[t]=function(n,r,i,s){return this.each(function(){if(n&&typeof n=="string")return e.fn[t].prototype[n].call(this,r,i,s);if(e(this).data(t+"data"))return e(this);e(this).data(t+"active",!0),e.fn[t].prototype._create.call(this)})},e.extend(e.fn[t].prototype,p)})(jQuery),function(e){var t="carousel",n="."+t,r=t+"-no-transition",i=/iPhone|iPad|iPod/.test(navigator.platform)&&navigator.userAgent.indexOf("AppleWebKit")>-1,s={_dragBehavior:function(){var t=e(this),s,o={},u,a,f=function(t){var r=t.touches||t.originalEvent.touches,i=e(t.target).closest(n);t.type==="touchstart"&&(s={x:r[0].pageX,y:r[0].pageY}),r[0]&&r[0].pageX&&(o.touches=r,o.deltaX=r[0].pageX-s.x,o.deltaY=r[0].pageY-s.y,o.w=i.width(),o.h=i.height(),o.xPercent=o.deltaX/o.w,o.yPercent=o.deltaY/o.h,o.srcEvent=t)},l=function(t){f(t),o.touches.length===1&&e(t.target).closest(n).trigger("drag"+t.type.split("touch")[1],o)};e(this).bind("touchstart",function(t){e(this).addClass(r),l(t)}).bind("touchmove",function(e){f(e),l(e),i||(e.preventDefault(),window.scrollBy(0,-o.deltaY))}).bind("touchend",function(t){e(this).removeClass(r),l(t)})}};e.extend(e.fn[t].prototype,s),e(document).on("create."+t,n,function(){e(this)[t]("_dragBehavior")})}(jQuery),function(e){var t="carousel",n="."+t,r=t+"-active",i=t+"-item",s=function(e){return Math.abs(e)>4},o=function(e,n){var r=e.find("."+t+"-active"),s=r.prevAll().length+1,o=n<0,u=s+(o?1:-1),a=e.find("."+i).eq(u-1);return a.length||(a=e.find("."+i)[o?"first":"last"]()),[r,a]};e(document).on("dragmove",n,function(t,n){if(!s(n.deltaX))return;var r=o(e(this),n.deltaX);r[0].css("left",n.deltaX+"px"),r[1].css("left",n.deltaX<0?n.w+n.deltaX+"px":-n.w+n.deltaX+"px")}).on("dragend",n,function(n,i){if(!s(i.deltaX))return;var u=o(e(this),i.deltaX),a=Math.abs(i.deltaX)>45;e(this).one(navigator.userAgent.indexOf("AppleWebKit")?"webkitTransitionEnd":"transitionEnd",function(){u[0].add(u[1]).css("left",""),e(this).trigger("goto."+t,u[1])}),a?(u[0].removeClass(r).css("left",i.deltaX>0?i.w+"px":-i.w+"px"),u[1].addClass(r).css("left",0)):(u[0].css("left",0),u[1].css("left",i.deltaX>0?-i.w+"px":i.w+"px"))})}(jQuery),function(e,t){var n="carousel",r="."+n+"[data-paginate]",i=n+"-pagination",s=n+"-active-page",o={_createPagination:function(){var t=e(this).find("."+n+"-nav"),r=e(this).find("."+n+"-item"),s=e("
    "),o,u,a;t.find("."+i).remove(),r.each(function(t){o=t+1,u=e(this).attr("data-thumb"),a=o,u&&(a=""),s.append("
  1. "+a+"")}),u&&s.addClass(n+"-nav-thumbs"),t.addClass(n+"-nav-paginated").find("a").first().after(s)},_bindPaginationEvents:function(){e(this).bind("click",function(t){var r=e(t.target);t.target.nodeName==="IMG"&&(r=r.parent()),r=r.closest("a");var s=r.attr("href");r.closest("."+i).length&&s&&(e(this)[n]("goTo",parseFloat(s.split("#")[1])),t.preventDefault())}).bind("goto."+n,function(t,n){var r=n?e(n).index():0;e(this).find("ol."+i+" li").removeClass(s).eq(r).addClass(s)}).trigger("goto."+n)}};e.extend(e.fn[n].prototype,o),e(document).on("create."+n,r,function(){e(this)[n]("_createPagination")[n]("_bindPaginationEvents")}).on("update."+n,r,function(){e(this)[n]("_createPagination")})}(jQuery),function(e){e(function(){e(".carousel").carousel()})}(jQuery); diff --git a/lms/static/js/vendor/responsive-carousel/responsive-carousel.keybd.js b/lms/static/js/vendor/responsive-carousel/responsive-carousel.keybd.js new file mode 100644 index 0000000000..c6b5993124 --- /dev/null +++ b/lms/static/js/vendor/responsive-carousel/responsive-carousel.keybd.js @@ -0,0 +1,38 @@ +/* + * responsive-carousel keyboard extension + * https://github.com/filamentgroup/responsive-carousel + * + * Copyright (c) 2012 Filament Group, Inc. + * Licensed under the MIT, GPL licenses. + */ + +(function($) { + var pluginName = "carousel", + initSelector = "." + pluginName, + navSelector = "." + pluginName + "-nav a", + buffer, + keyNav = function( e ) { + clearTimeout( buffer ); + buffer = setTimeout(function() { + var $carousel = $( e.target ).closest( initSelector ); + + if( e.keyCode === 39 || e.keyCode === 40 ){ + $carousel[ pluginName ]( "next" ); + } + else if( e.keyCode === 37 || e.keyCode === 38 ){ + $carousel[ pluginName ]( "prev" ); + } + }, 200 ); + + if( 37 <= e.keyCode <= 40 ) { + e.preventDefault(); + } + }; + + // Touch handling + $( document ) + .on( "click", navSelector, function( e ) { + $( e.target )[ 0 ].focus(); + }) + .on( "keydown", navSelector, keyNav ); +}(jQuery)); diff --git a/lms/static/sass/application.scss.mako b/lms/static/sass/application.scss.mako index fb7b4b1db2..c17b23b0dc 100644 --- a/lms/static/sass/application.scss.mako +++ b/lms/static/sass/application.scss.mako @@ -9,7 +9,8 @@ @import 'base/reset'; @import 'vendor/font-awesome'; - +@import 'vendor/responsive-carousel/responsive-carousel'; +@import 'vendor/responsive-carousel/responsive-carousel.slide'; // BASE *default edX offerings* // ==================== @@ -36,12 +37,18 @@ // base - assets @import 'base/font_face'; @import 'base/extends'; -@import 'base/animations'; +@import 'base/animations'; // base - starter @import 'base/base'; -// shared - course +// base - elements +@import 'elements/typography'; + +// base - specific views +@import 'views/verification'; + +// shared - course @import 'shared/forms'; @import 'shared/footer'; @import 'shared/header'; @@ -67,7 +74,7 @@ @import 'multicourse/help'; @import 'multicourse/edge'; -// applications +// applications @import 'discussion'; @import 'news'; diff --git a/lms/static/sass/base/_mixins.scss b/lms/static/sass/base/_mixins.scss index e2074f1976..8ee4559e36 100644 --- a/lms/static/sass/base/_mixins.scss +++ b/lms/static/sass/base/_mixins.scss @@ -1,3 +1,6 @@ +// lms - utilities - mixins and extends +// ==================== + // mixins - font sizing @mixin font-size($sizeValue: 16){ font-size: $sizeValue + px; @@ -44,6 +47,9 @@ } + + + //----------------- // Theme Mixin Styles //----------------- diff --git a/lms/static/sass/base/_variables.scss b/lms/static/sass/base/_variables.scss index 93297f4043..2028b95efb 100644 --- a/lms/static/sass/base/_variables.scss +++ b/lms/static/sass/base/_variables.scss @@ -9,6 +9,7 @@ $fg-max-columns: 12; $fg-max-width: 1400px; $fg-min-width: 810px; +// fonts $sans-serif: 'Open Sans', $verdana; $monospace: Monaco, 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; $body-font-family: $sans-serif; @@ -197,4 +198,14 @@ $homepage-bg-image: '../images/homepage-bg.jpg'; $login-banner-image: url(../images/bg-banner-login.png); $register-banner-image: url(../images/bg-banner-register.png); -$video-thumb-url: '../images/courses/video-thumb.jpg'; \ No newline at end of file +$video-thumb-url: '../images/courses/video-thumb.jpg'; + +//----------------- +// Newer variables ported from Studio +//----------------- + +// fonts +$f-serif: 'Bree Serif', Georgia, Cambria, 'Times New Roman', Times, serif; +$f-sans-serif: 'Open Sans','Helvetica Neue', Helvetica, Arial, sans-serif; +$f-monospace: 'Bitstream Vera Sans Mono', Consolas, Courier, monospace; + diff --git a/lms/static/sass/elements/_typography.scss b/lms/static/sass/elements/_typography.scss new file mode 100644 index 0000000000..157d3d60df --- /dev/null +++ b/lms/static/sass/elements/_typography.scss @@ -0,0 +1,178 @@ +// lms - elements - typography +// ==================== + +// Scale - (6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 21, 24, 36, 48, 60, 72) + +// headings/titles +.t-title { + font-family: $f-sans-serif; +} + +.t-title1 { + @extend .t-title; + @include font-size(60); + @include line-height(60); +} + +.t-title2 { + @extend .t-title; + @include font-size(48); + @include line-height(48); +} + +.t-title3 { + @include font-size(36); + @include line-height(36); +} + +.t-title4 { + @extend .t-title; + @include font-size(24); + @include line-height(24); +} + +.t-title5 { + @extend .t-title; + @include font-size(18); + @include line-height(18); +} + +.t-title6 { + @extend .t-title; + @include font-size(16); + @include line-height(16); +} + +.t-title7 { + @extend .t-title; + @include font-size(14); + @include line-height(14); +} + +.t-title8 { + @extend .t-title; + @include font-size(12); + @include line-height(12); +} + +.t-title9 { + @extend .t-title; + @include font-size(11); + @include line-height(11); +} + +// ==================== + +// copy +.t-copy { + font-family: $f-sans-serif; +} + +.t-copy-base { + @extend .t-copy; + @include font-size(16); + @include line-height(16); +} + +.t-copy-lead1 { + @extend .t-copy; + @include font-size(18); + @include line-height(18); +} + +.t-copy-lead2 { + @extend .t-copy; + @include font-size(24); + @include line-height(24); +} + +.t-copy-sub1 { + @extend .t-copy; + @include font-size(14); + @include line-height(14); +} + +.t-copy-sub2 { + @extend .t-copy; + @include font-size(12); + @include line-height(12); +} + +// ==================== + +// actions/labels +.t-action1 { + @include font-size(18); + @include line-height(18); +} + +.t-action2 { + @include font-size(16); + @include line-height(16); +} + +.t-action3 { + @include font-size(14); + @include line-height(14); +} + +.t-action4 { + @include font-size(12); + @include line-height(12); +} + + +// ==================== + +// code +.t-code { + font-family: $f-monospace; +} + +// ==================== + +// icons +.t-icon1 { + @include font-size(48); + @include line-height(48); +} + +.t-icon2 { + @include font-size(36); + @include line-height(36); +} + +.t-icon3 { + @include font-size(24); + @include line-height(24); +} + +.t-icon4 { + @include font-size(18); + @include line-height(18); +} + +.t-icon5 { + @include font-size(16); + @include line-height(16); +} + +.t-icon6 { + @include font-size(14); + @include line-height(14); +} + +.t-icon7 { + @include font-size(12); + @include line-height(12); +} + +.t-icon8 { + @include font-size(11); + @include line-height(11); +} + +.t-icon9 { + @include font-size(10); + @include line-height(10); +} diff --git a/lms/static/sass/vendor/responsive-carousel/_responsive-carousel.scss b/lms/static/sass/vendor/responsive-carousel/_responsive-carousel.scss new file mode 100644 index 0000000000..cbd8d701de --- /dev/null +++ b/lms/static/sass/vendor/responsive-carousel/_responsive-carousel.scss @@ -0,0 +1,20 @@ +/* + * responsive-carousel + * https://github.com/filamentgroup/responsive-carousel + * + * Copyright (c) 2012 Filament Group, Inc. + * Licensed under the MIT, GPL licenses. + */ +.carousel { + width: 100%; + position: relative; +} +.carousel .carousel-item { + display: none; +} +.carousel .carousel-active { + display: block; +} +.carousel .carousel-nav:nth-child(2) { + display: none; +} diff --git a/lms/static/sass/vendor/responsive-carousel/_responsive-carousel.slide.scss b/lms/static/sass/vendor/responsive-carousel/_responsive-carousel.slide.scss new file mode 100644 index 0000000000..b902bc6575 --- /dev/null +++ b/lms/static/sass/vendor/responsive-carousel/_responsive-carousel.slide.scss @@ -0,0 +1,61 @@ +/* + * responsive-carousel + * https://github.com/filamentgroup/responsive-carousel + * + * Copyright (c) 2012 Filament Group, Inc. + * Licensed under the MIT, GPL licenses. +*/ +.carousel-slide { + position: relative; + overflow: hidden; + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +.carousel-slide .carousel-item { + position: absolute; + left: 100%; + top: 0; + width: 100%; /* necessary for non-active slides */ + display: block; /* overrides basic carousel styles */ + z-index: 1; + -webkit-transition: left .2s ease; + -moz-transition: left .2s ease; + -ms-transition: left .2s ease; + -o-transition: left .2s ease; + transition: left .2s ease; +} +.carousel-no-transition .carousel-item { + -webkit-transition: none; + -moz-transition: none; + -ms-transition: none; + -o-transition: none; + transition: none; +} +.carousel-slide .carousel-active { + left: 0; + position: relative; + z-index: 2; +} +.carousel-slide .carousel-in { + left: 0; +} +.carousel-slide-reverse .carousel-out { + left: 100%; +} +.carousel-slide .carousel-out, +.carousel-slide-reverse .carousel-in { + left: -100%; +} +.carousel-slide-reverse .carousel-item { + -webkit-transition: left .1s ease; + -moz-transition: left .1s ease; + -ms-transition: left .1s ease; + -o-transition: left .1s ease; + transition: left .1s ease; +} +.carousel-slide-reverse .carousel-active { + left: 0; +} diff --git a/lms/static/sass/views/_verification.scss b/lms/static/sass/views/_verification.scss new file mode 100644 index 0000000000..691652063c --- /dev/null +++ b/lms/static/sass/views/_verification.scss @@ -0,0 +1,166 @@ +// lms - views - verification flow +// ==================== + +body.register.verification { + font-family: 'Open Sans', sans-serif; + + h1, h2, h3, h4, h5, h6, p { + font-family: 'Open Sans', sans-serif; + } + + + .page-header { + + .title { + @extend .t-title5; + margin-bottom: $baseline; + font-weight: bold; + } + } + + .title { + @extend .t-title9; + margin-bottom: ($baseline/2); + font-weight: bold; + } + + .select { + @include clearfix(); + + + .block { + float: left; + margin: 0 $baseline $baseline 0; + background-color: #eee; + padding: $baseline; + width: 60%; + + .title { + @extend .t-title7; + } + + } + + .tips { + float: right; + width: 32%; + } + + } + + + + + + .progress { + + .progress-step { + border: 1px solid #eee; + display: inline-block; + padding: ($baseline/2) $baseline; + } + } + + + // for dev placement only + .placeholder-cam, + .placeholder-photo { + height: 300px; + background-color: #eee; + position: relative; + + p { + position: absolute; + top: 40%; + left: 40%; + color: #ccc; + } + } + + .block-photo { + @include clearfix(); + background-color: $white; + + .title { + font-weight: bold; + } + + .wrapper-up, + .wrapper-down { + @include clearfix(); + } + + .cam { + width: 45%; + float: left; + padding-right: $baseline; + } + + .photo-controls { + background-color: #ddd; + + .controls-list { + margin: 0; + padding: ($baseline*.25) ($baseline*.75); + list-style-type: none; + + .control { + display: inline-block; + + .action { + @extend .button-primary; + display: block; + background-color: $blue; + color: $white; + padding: ($baseline*.25) ($baseline*.5); + border: none; + + &:hover { + + } + } + } + } + } + + .faq { + width: 45%; + float: left; + padding-right: $baseline; + + dt { + font-weight: bold; + padding: 0 0 ($baseline/2) 0; + } + + dd { + margin: 0; + padding: 0 0 $baseline 0; + } + } + + + + } + + .photo-tips { + width: 45%; + float: left; + } + + .actions { + width: 45%; + float: right; + } + + .review-photo { + width: 45%; + float: left; + } + + #review-facephoto { + margin-right: $baseline; + } + + +} diff --git a/lms/templates/main.html b/lms/templates/main.html index a25e8f5261..179a84f7d3 100644 --- a/lms/templates/main.html +++ b/lms/templates/main.html @@ -92,6 +92,9 @@ <%static:js group='application'/> <%static:js group='module-js'/> + + + <%block name="js_extra"/> diff --git a/lms/templates/verify_student/face_upload.html b/lms/templates/verify_student/face_upload.html index 6338750c06..eb9970f86b 100644 --- a/lms/templates/verify_student/face_upload.html +++ b/lms/templates/verify_student/face_upload.html @@ -2,10 +2,277 @@ <%! from django.core.urlresolvers import reverse %> <%inherit file="../main.html" /> +<%block name="bodyclass">register verification photos + +<%block name="js_extra"> + + + + + <%block name="content"> +
    -

    Face Upload!

    + + +
    +

    Your Progress

    +
      +
    1. Current: Step 1 Take Your Photo
    2. +
    3. Step 2 ID Photo
    4. +
    5. Step 3 Review
    6. +
    7. Step 4 Payment
    8. +
    9. Finished Confirmation
    10. +
    +
    + + + + + + + +
    +

    More questions? Check out our FAQs.

    +

    Change your mind? You can always Audit the course for free without verifying.

    +
    + + +
    + + + + -Upload Photo ID diff --git a/lms/templates/verify_student/photo_id_upload.html b/lms/templates/verify_student/photo_id_upload.html index b6724656f4..e530b706a8 100644 --- a/lms/templates/verify_student/photo_id_upload.html +++ b/lms/templates/verify_student/photo_id_upload.html @@ -2,10 +2,84 @@ <%! from django.core.urlresolvers import reverse %> <%inherit file="../main.html" /> +<%block name="bodyclass">register verification select + <%block name="content"> +
    +
    -

    Photo ID Upload!

    + -Final Verification +

    Select your track:

    + +
    +
    +

    Audit

    +

    Sign up to audit this course for free and track your own progress.

    + +

    + Select Audit +

    +
    + +
    +
    +

    Certificate of Achievement

    +

    Sign up as a verified student and work toward a Certificate of Achievement.

    +
    +
    + Select your contribution for this course (in USD): +
    +
    +
      +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    +
    +
    + + Why do I have to pay? What if I don't meet all the requirements? + + + +

    + What is an ID Verified Certificate? +

    + +

    + Select Certificate +

    +
    + +
    +

    + To register for a Verified Certificate of Achievement option, you will need a webcam, a credit or debit card, and an ID. View requirements +

    +
    + +
    + + +

    Have questions? Check out our FAQs.

    +

    Not the course you wanted? Return to our course listings.

    + + +
    +