Index: app/controllers/assignments_controller.rb
===================================================================
--- app/controllers/assignments_controller.rb	(revision 1122)
+++ app/controllers/assignments_controller.rb	(working copy)
@@ -102,8 +102,10 @@
     @assignments = Assignment.all
     @assignment = Assignment.new
     @assignment.build_submission_rule
-    #@assignment.assignment_files.build
+    
     if !request.post?
+      # set default value if web submits are allowed
+      @assignment.allow_web_submits = markus_config_repository_external_submits_only?
       render :action => 'new'
       return
     end   
Index: app/models/assignment.rb
===================================================================
--- app/models/assignment.rb	(revision 1122)
+++ app/models/assignment.rb	(working copy)
@@ -34,6 +34,9 @@
   validates_presence_of :submission_rule
   
   validates_presence_of :marking_scheme_type
+  # since allow_web_submits is a boolean, validates_presence_of does not work:
+  # see the Rails API documentation for validates_presence_of (Model validations)
+  validates_inclusion_of :allow_web_submits, :in => [true, false] 
   
   def validate
     if (group_max && group_min) && group_max < group_min
Index: app/models/group.rb
===================================================================
--- app/models/group.rb	(revision 1122)
+++ app/models/group.rb	(working copy)
@@ -45,7 +45,8 @@
   # file submissions via the Web interface are not permitted. For
   # now, this works for Subversion repositories only.
   def repository_external_commits_only?
-    return markus_config_external_submits_only?
+    assignment = assignments.first
+    return !assignment.allow_web_submits
   end
   
   # Returns the URL for externally accessible repos
Index: app/models/grouping.rb
===================================================================
--- app/models/grouping.rb	(revision 1122)
+++ app/models/grouping.rb	(working copy)
@@ -11,7 +11,7 @@
   has_many :memberships
   has_many :student_memberships
   has_many :accepted_student_memberships, :class_name => "StudentMembership", :conditions => {'memberships.membership_status' => [StudentMembership::STATUSES[:accepted], StudentMembership::STATUSES[:inviter]]}
-  has_many :note, :as => :noteable, :dependent => :destroy
+  has_many :notes, :as => :noteable, :dependent => :destroy
   has_many :ta_memberships, :class_name => "TAMembership"
   has_many :students, :through => :student_memberships, :source => :user
   has_many :accepted_students, :class_name => 'Student', :through => :student_memberships, :conditions => {'memberships.membership_status' => [StudentMembership::STATUSES[:accepted], StudentMembership::STATUSES[:inviter]]}, :source => :user
Index: app/models/rubric_criterion.rb
===================================================================
--- app/models/rubric_criterion.rb	(revision 1122)
+++ app/models/rubric_criterion.rb	(working copy)
@@ -4,7 +4,7 @@
   set_table_name "rubric_criteria" # set table name correctly
   belongs_to  :assignment
   has_many    :marks, :as => :markable, :dependent => :destroy
-  validates_associated      :assignment, :message => 'association is not strong with an assignment'
+  validates_associated  :assignment, :message => 'association is not strong with an assignment'
   validates_uniqueness_of :rubric_criterion_name, :scope => :assignment_id, :message => 'is already taken'
   validates_presence_of :rubric_criterion_name, :weight, :assignment_id
   validates_numericality_of :assignment_id, :only_integer => true, :greater_than => 0, :message => "can only be whole number greater than 0"
Index: app/models/user.rb
===================================================================
--- app/models/user.rb	(revision 1122)
+++ app/models/user.rb	(working copy)
@@ -6,8 +6,8 @@
 class User < ActiveRecord::Base
   # Group relationships  
   has_many :memberships
-  has_many :groupings, :through => :memberships  
-  has_many :note, :through => :creator_id
+  has_many :groupings, :through => :memberships
+  has_many :notes, :as => :noteable, :dependent => :destroy
   has_many :accepted_memberships, :class_name => "Membership", :conditions => {:membership_status => [StudentMembership::STATUSES[:accepted], StudentMembership::STATUSES[:inviter]]}
     
   validates_presence_of     :user_name, :last_name, :first_name
Index: app/views/assignments/_form.html.erb
===================================================================
--- app/views/assignments/_form.html.erb	(revision 1122)
+++ app/views/assignments/_form.html.erb	(working copy)
@@ -30,7 +30,12 @@
           :time => "mixed",
           :after_close => "refresh_due_date();",
           :year_range => 0.years.ago..1.years.from_now, :id => "assignment_due_date"} %>
-   <%= observe_field "assignment_due_date", :function => "update_due_date($F('assignment_due_date'));" %> <%=t(:iso_due_date_format_example)%>
+   <%= observe_field "assignment_due_date", :function => "update_due_date($F('assignment_due_date'));" %> <%=t(:iso_due_date_format_example)%><br />
+    <%= f.label :repository_folder, "Repository Folder"%>
+    /<%= f.text_field :repository_folder%><br />
+	<%= f.label :allow_web_submits, t("assignment.allow_web_submits") %>&nbsp;&nbsp;
+    <%= t("answer_yes")%>:<%= f.radio_button :allow_web_submits, true, :checked => @assignment.allow_web_submits %>&nbsp;&nbsp;
+	<%= t("answer_no")%>:<%= f.radio_button :allow_web_submits, false, :checked => !@assignment.allow_web_submits %>
    <br />
    <br />
 
@@ -58,9 +63,7 @@
 </fieldset>
 
 <fieldset>
-  <legend>Submitted Files</legend>
-     <%= f.label :repository_folder, "Repository Folder"%>
-    /<%= f.text_field :repository_folder%>
+  <legend>Required Files</legend>
   <h4>Add filename(s) that students would be required to submit:</h4>
    <div id="assignment_files">
      <% f.fields_for :assignment_files do |assignment_file_form| %>
Index: config/locales/en.yml
===================================================================
--- config/locales/en.yml	(revision 1122)
+++ config/locales/en.yml	(working copy)
@@ -1,4 +1,6 @@
 en:
+    answer_yes:         "Yes"
+    answer_no:          "No"
     markus:             "MarkUs"
     login:              "Login"
     login_failed:       "Login failed"
@@ -33,7 +35,6 @@
     uploading_please_wait: "Uploading - please wait..."
     choose_assignment:  "Choose..."
     properties:         "Properties"
-    properties:         "Properties"
     submissions:        "Submissions"
     groups_and_graders: "Groups & Graders"
     rubrics:            "Rubrics"
@@ -170,6 +171,7 @@
             flexible: "Flexible"
         notice:
             change_marking_scheme_type: "Changing marking scheme will delete your criteria and marks."
+        allow_web_submits: "Allow Web Submits?"
         
     confirm_bulk_action:  "Are you sure you want to perform this bulk action?"
     hide_students: "Hide Students"
Index: db/migrate/20091123000907_add_allow_web_submits_field_to_assignments_table.rb
===================================================================
--- db/migrate/20091123000907_add_allow_web_submits_field_to_assignments_table.rb	(revision 0)
+++ db/migrate/20091123000907_add_allow_web_submits_field_to_assignments_table.rb	(revision 0)
@@ -0,0 +1,9 @@
+class AddAllowWebSubmitsFieldToAssignmentsTable < ActiveRecord::Migration
+  def self.up
+    add_column :assignments, :allow_web_submits, :boolean, :default => true
+  end
+
+  def self.down
+    remove_column :assignments, :allow_web_submits
+  end
+end
Index: db/populate/04_assignments.rb
===================================================================
--- db/populate/04_assignments.rb	(revision 1122)
+++ db/populate/04_assignments.rb	(working copy)
@@ -4,13 +4,15 @@
 :message => "Learn to use conditional statements, and loops.",
 :group_min => 1, :group_max => 1, :student_form_groups => false,
 :group_name_autogenerated => true, :group_name_displayed => false,
-:repository_folder => "A1", :due_date => 1.minute.from_now, :marking_scheme_type => Assignment::MARKING_SCHEME_TYPE[:rubric])
+:repository_folder => "A1", :due_date => 1.minute.from_now, :marking_scheme_type => Assignment::MARKING_SCHEME_TYPE[:rubric],
+:allow_web_submits => true)
 a.submission_rule = rule
 a.save
 
 rule = NoLateSubmissionRule.new
 a = Assignment.create(:short_identifier => "A2", :description => "Cats and Dogs",
 :message => "Basic exercise in Object Oriented Programming.  Implement Animal, Cat, and Dog, as described in class.", :group_min => 2, :group_max => 3, :student_form_groups => true, :group_name_autogenerated => true, :group_name_displayed => false,
-:repository_folder => "A2", :due_date => 1.month.from_now, :marking_scheme_type => Assignment::MARKING_SCHEME_TYPE[:rubric])
+:repository_folder => "A2", :due_date => 1.month.from_now, :marking_scheme_type => Assignment::MARKING_SCHEME_TYPE[:rubric],
+:allow_web_submits => true)
 a.submission_rule = rule
 a.save
Index: db/schema.rb
===================================================================
--- db/schema.rb	(revision 1122)
+++ db/schema.rb	(working copy)
@@ -66,6 +66,7 @@
     t.boolean  "instructor_form_groups"
     t.float    "results_average"
     t.string   "marking_scheme_type",      :default => "rubric"
+    t.boolean  "allow_web_submits"
   end
 
   add_index "assignments", ["short_identifier"], :name => "index_assignments_on_name", :unique => true
Index: lib/markus_configurator.rb
===================================================================
--- lib/markus_configurator.rb	(revision 1122)
+++ lib/markus_configurator.rb	(working copy)
@@ -23,15 +23,11 @@
   end
   
   def markus_config_repository_external_submits_only?
-    if repository_admin? && (REPOSITORY_EXTERNAL_SUBMITS_ONLY || false)
-      case repository_type
-        when "svn"
-          retval = true
-        else
-          retval = false
-      end
-    else
-      retval = false
+    case markus_config_repository_type
+      when "svn"
+        retval = (REPOSITORY_EXTERNAL_SUBMITS_ONLY || false)
+      else
+        retval = false
     end
     return retval
   end
@@ -40,10 +36,6 @@
     return REPOSITORY_PERMISSION_FILE || File.join(repository_storage, "svn_authz")
   end
   
-  def markus_config_external_submits_only?
-    return REPOSITORY_EXTERNAL_SUBMITS_ONLY || false
-  end
-  
   ######################################
   # MarkusLogger configuration
   ######################################
Index: lib/tasks/populate.rake
===================================================================
--- lib/tasks/populate.rake	(revision 1122)
+++ lib/tasks/populate.rake	(working copy)
@@ -67,6 +67,7 @@
     a1.group_min = 1
     a1.group_max = 1
     a1.marking_scheme_type = Assignment::MARKING_SCHEME_TYPE[:rubric]
+    a1.allow_web_submits = true
     a1.save
     req_file1.save
     req_file2.save
@@ -79,7 +80,8 @@
     a2.group_min = 3
     a2.group_max = 5
     a2.instructor_form_groups = false
-    a2.marking_scheme_type = "rubric"
+    a2.marking_scheme_type = Assignment::MARKING_SCHEME_TYPE[:rubric]
+    a2.allow_web_submits = true
     req_file1 = AssignmentFile.new
     req_file1.filename = "Animal.java"
     req_file1.assignment = a2
@@ -108,6 +110,7 @@
     req_file1.filename = "gcd.sh"
     req_file1.assignment = a3
     a3.submission_rule = rule
+    a3.allow_web_submits = true
     a3.marking_scheme_type = Assignment::MARKING_SCHEME_TYPE[:rubric]
     a3.save
     # create groupings/groups
Index: test/fixtures/assignments.yml
===================================================================
--- test/fixtures/assignments.yml	(revision 1122)
+++ test/fixtures/assignments.yml	(working copy)
@@ -34,6 +34,7 @@
    updated_at: <%= Time.now.to_s(:db)%>
    repository_folder: CaptainNemo
    marking_scheme_type: "rubric"
+   allow_web_submits: false
 
 assignment_build_on_top_of_1:
    short_identifier: Captain CopyCat
@@ -50,6 +51,7 @@
    updated_at: <%= Time.now.to_s(:db)%>
    repository_folder: CaptainCopyCat
    marking_scheme_type: "rubric"
+   allow_web_submits: true
 
 assignment_2:
    short_identifier: Captain Sparrow
@@ -66,6 +68,7 @@
    updated_at: <%= Time.now.to_s(:db)%>
    repository_folder: CaptainSparrow
    marking_scheme_type: "rubric"
+   allow_web_submits: true
 
 assignment_3:
    short_identifier: Captain Haddock
@@ -82,6 +85,7 @@
    updated_at: <%= Time.now.to_s(:db)%>
    repository_folder: CaptainSparrow
    marking_scheme_type: "rubric"
+   allow_web_submits: true
 
 assignment_4:
    short_identifier: Captain Late
@@ -98,6 +102,7 @@
    updated_at: <%= Time.now.to_s(:db)%>
    repository_folder: CaptainLate
    marking_scheme_type: "rubric"
+   allow_web_submits: true
    
 assignment_5:
    short_identifier: A5
@@ -114,6 +119,7 @@
    updated_at: <%= Time.now.to_s(:db)%>
    repository_folder: A5
    marking_scheme_type: "rubric"
+   allow_web_submits: true
 
 assignment_6:
    short_identifier: A6
@@ -130,6 +136,7 @@
    updated_at: <%= Time.now.to_s(:db)%>
    repository_folder: A6
    marking_scheme_type: "rubric"
+   allow_web_submits: true
 
 
 flexible_assignment:
@@ -147,6 +154,7 @@
    updated_at: <%= Time.now.to_s(:db)%>
    repository_folder: FlexiblyYours
    marking_scheme_type: "flexible"
+   allow_web_submits: true
 
 flexible_assignment_without_criterion:
    short_identifier: "How flexible can you get?"
@@ -163,6 +171,7 @@
    updated_at: <%= Time.now.to_s(:db)%>
    repository_folder: flexible2
    marking_scheme_type: "flexible"
+   allow_web_submits: false
    
 flexible_assignment_2:
    short_identifier: Flex2
@@ -179,3 +188,4 @@
    updated_at: <%= Time.now.to_s(:db)%>
    repository_folder: Flex2
    marking_scheme_type: "flexible"
+   allow_web_submits: true
\ No newline at end of file
Index: test/functional/assignments_controller_test.rb
===================================================================
--- test/functional/assignments_controller_test.rb	(revision 1122)
+++ test/functional/assignments_controller_test.rb	(working copy)
@@ -33,6 +33,25 @@
     destroy_repos
   end
   
+  
+  context "A logged in admin doing a POST" do
+    
+    setup do
+      @admin = users(:olm_admin_1)
+      @assignment = assignments(:assignment_1)
+    end
+    
+    context "on new" do
+      setup do
+        post_as @admin, :new, :id => @assignment.id
+      end
+      
+      should_assign_to :assignment, :assignments
+      should_respond_with :success
+    end
+    
+  end # context: A logged in admin doing a GET
+  
   # Test for accessing new assignment page
   def test_get_new
     get_as @admin, :new
Index: test/unit/assignment_test.rb
===================================================================
--- test/unit/assignment_test.rb	(revision 1122)
+++ test/unit/assignment_test.rb	(working copy)
@@ -2,16 +2,26 @@
 require 'shoulda'
 
 class AssignmentTest < ActiveSupport::TestCase
- 
+  
+  fixtures :assignments, :users, :submission_rules, :submissions, :groups, :rubric_criteria, :marks, :results, :groupings
+  set_fixture_class :rubric_criteria => RubricCriterion
+  
   should_validate_presence_of :marking_scheme_type
+  # Should_validate_presence_of does not work for boolean value false.
+  # Using should_allow_values_for instead
+  should_allow_values_for :allow_web_submits, true, false
   
-  fixtures :assignments, :users, :submissions, :groups, :rubric_criteria, :marks, :results, :groupings
-  set_fixture_class :rubric_criteria => RubricCriterion
- 
   def setup
     setup_group_fixture_repos
   end
   
+  context "An assignment" do
+    setup do
+      assignment = assignments(:assignment_6) # required for should_not_allow_values_for test
+      should_not_allow_values_for :allow_web_submits, "garbage"
+    end
+  end
+  
   def teardown
     destroy_repos
   end
@@ -181,10 +191,10 @@
 
    def test_clone_groupings_from_04
      oa = assignments(:assignment_1)
-     number = Membership.all.size
+     number = StudentMembership.all.size + TAMembership.all.size
      a = assignments(:assignment_build_on_top_of_1)
      a.clone_groupings_from(oa.id)
-     assert_not_equal(number, Membership.all.size)
+     assert_not_equal(number, StudentMembership.all.size + TAMembership.all.size)
    end
 
    # TODO create a test for cloning group, when groups already exist
Index: test/unit/group_test.rb
===================================================================
--- test/unit/group_test.rb	(revision 1122)
+++ test/unit/group_test.rb	(working copy)
@@ -2,7 +2,7 @@
 require 'shoulda'
 
 class GroupTest < ActiveSupport::TestCase
-  fixtures :users
+  fixtures :users, :groupings, :groups
   should_have_many :groupings
   should_have_many :submissions, :through => :groupings
   should_have_many :assignments, :through => :groupings
@@ -27,7 +27,7 @@
     assert group.save, "Group not saved..."
   end
 
-  def  test_is_valid_false
+  def test_is_valid_false
      grouping = groupings(:grouping_3)
      assert !grouping.is_valid?
   end
@@ -37,6 +37,15 @@
     grouping.validate_grouping
     assert grouping.is_valid?
   end
+  
+  context "A Group object" do
+    should "know if external submits are allowed or not" do
+      group = groups(:group_1)
+      assert_equal true, group.repository_external_commits_only?
+      group2 = groups(:group1)
+      assert_equal false, group2.repository_external_commits_only?
+    end
+  end
 
 end
 

