def generate_submission_contents(activity, z, prefix=''): """ add of of the submissions for this activity to the ZipFile z """ # build dictionary of all most recent submissions by student userid/group slug if activity.group: submissions = GroupSubmission.objects.filter( activity=activity).order_by('created_at').select_related( 'activity', 'group') else: submissions = StudentSubmission.objects.filter( activity=activity).order_by('created_at').select_related( 'activity', 'member', 'member__person') # group submissions by student/group submissions_by_person = {} for s in submissions: slug = s.file_slug() if slug not in submissions_by_person: submissions_by_person[slug] = [] subs = submissions_by_person[slug] subs.append(s) component_list = select_all_components(activity, include_deleted=True) sub_time = {} # submission times for summary # now collect submitted components (and last-submission times for summary) for slug in submissions_by_person: submission = submissions_by_person[slug] last_sub = max([s.created_at for s in submission]) sub_time[slug] = last_sub submitted_components = get_all_submission_components( submission, activity, component_list=component_list) _add_submission_to_zip(z, submission[-1], submitted_components, prefix=prefix + slug) # produce summary of submission datetimes slugs = sub_time.keys() slugs.sort() summarybuffer = StringIO.StringIO() summarycsv = csv.writer(summarybuffer) summarycsv.writerow([Person.userid_header(), "Last Submission"]) for s in slugs: summarycsv.writerow([s, sub_time[s].strftime("%Y/%m/%d %H:%M:%S")]) z.writestr(prefix + "summary.csv", summarybuffer.getvalue()) summarybuffer.close()
def generate_submission_contents(activity, z, prefix=''): """ add of of the submissions for this activity to the ZipFile z """ # build dictionary of all most recent submissions by student userid/group slug if activity.group: submissions = GroupSubmission.objects.filter(activity=activity).order_by('created_at').select_related('activity','group') else: submissions = StudentSubmission.objects.filter(activity=activity).order_by('created_at').select_related('activity','member','member__person') # group submissions by student/group submissions_by_person = {} for s in submissions: slug = s.file_slug() if slug not in submissions_by_person: submissions_by_person[slug] = [] subs = submissions_by_person[slug] subs.append(s) component_list = select_all_components(activity, include_deleted=True) sub_time = {} # submission times for summary # now collect submitted components (and last-submission times for summary) for slug in submissions_by_person: submission = submissions_by_person[slug] last_sub = max([s.created_at for s in submission]) sub_time[slug] = last_sub submitted_components = get_all_submission_components(submission, activity, component_list=component_list) _add_submission_to_zip(z, submission[-1], submitted_components, prefix=prefix+slug) # produce summary of submission datetimes slugs = sub_time.keys() slugs.sort() summarybuffer = StringIO.StringIO() summarycsv = csv.writer(summarybuffer) summarycsv.writerow([Person.userid_header(), "Last Submission"]) for s in slugs: summarycsv.writerow([s, sub_time[s].strftime("%Y/%m/%d %H:%M:%S")]) z.writestr(prefix+"summary.csv", summarybuffer.getvalue()) summarybuffer.close()
def generate_submission_contents(activity, z, prefix=''): """ add of of the submissions for this activity to the ZipFile z """ from submission.models.gittag import GitTagComponent # build dictionary of all most recent submissions by student userid/group slug if activity.group: submissions = GroupSubmission.objects.filter( activity=activity).order_by('created_at').select_related( 'activity', 'group') else: submissions = StudentSubmission.objects.filter( activity=activity).order_by('created_at').select_related( 'activity', 'member', 'member__person') # group submissions by student/group submissions_by_person = {} for s in submissions: slug = s.file_slug() if slug not in submissions_by_person: submissions_by_person[slug] = [] subs = submissions_by_person[slug] subs.append(s) component_list = select_all_components(activity, include_deleted=True) sub_time = {} # submission times for summary # Manage a collection of git tag submission data we see, to produce clone-all script. any_git_tags = any(isinstance(c, GitTagComponent) for c in component_list) git_tags = [] # now collect submitted components (and last-submission times for summary) for slug in submissions_by_person: submission = submissions_by_person[slug] last_sub = max([s.created_at for s in submission]) sub_time[slug] = last_sub submitted_components = get_all_submission_components( submission, activity, component_list=component_list) _add_submission_to_zip(z, submission[-1], submitted_components, prefix=prefix + slug, slug=slug) git_tags.extend((comp.slug, slug, sub.url, sub.tag) for comp, sub in submitted_components if isinstance(comp, GitTagComponent) and sub) # produce summary of submission datetimes slugs = sub_time.keys() slugs.sort() summarybuffer = StringIO.StringIO() summarycsv = csv.writer(summarybuffer) summarycsv.writerow([Person.userid_header(), "Last Submission"]) for s in slugs: summarycsv.writerow([s, sub_time[s].strftime("%Y/%m/%d %H:%M:%S")]) z.writestr(prefix + "summary.csv", summarybuffer.getvalue()) summarybuffer.close() # produce git clone-all script if any_git_tags: script = [ '#!/bin/sh', '', '# This script will clone all of the submitted git tags for this activity,', '# putting them into the current directory. This should work in a Linux, OSX,', '# or the Git Bash shell in Windows.', '' ] git_tags.sort() for comp_slug, sub_slug, url, tag in git_tags: dir_name = comp_slug + '_' + sub_slug script.append( 'git clone %s %s && \\\n (cd %s && git checkout tags/%s)' % (quote(url), quote(dir_name), quote(dir_name), quote(tag))) script.append('') z.writestr(prefix + "clone-all.sh", '\n'.join(script))
def generate_submission_contents(self, z, prefix='', always_summary=True): """ Assemble submissions and put in ZIP file. """ self.ensure_components() assert self.submissions is not None assert self.all_submitted_components is not None multi = self.activity.multisubmit() from submission.models.gittag import GitTagComponent any_git_tags = any( isinstance(c, GitTagComponent) for c in self.components) git_tags = [] # Collect all of the SubmittedComponents that we need to output # i.e. the most recent of each by student|group and component found = set( ) # (student|group, SubmissionComponent) pairs we have already included individual_subcomps = { } # student|group: [(SubmissionComponent, SubmittedComponent)] last_submission = {} # student|group: final Submission for sub, subcomps in self.submissions_and_components(): slug = sub.file_slug() for comp, sc in subcomps: key = (slug, comp.slug) if (not multi and key in found) or sc is None: continue if slug not in last_submission: last_submission[slug] = sub found.add(key) scs = individual_subcomps.get(slug, []) scs.append((comp, sc)) individual_subcomps[sub.file_slug()] = scs # Now add them to the ZIP for slug, subcomps in individual_subcomps.items(): lastsub = last_submission[slug] p = os.path.join(prefix, slug) self._add_to_zip(z, self.activity, subcomps, lastsub.created_at, slug=lastsub.file_slug(), prefix=p, multi=multi) git_tags.extend((comp.slug, slug, sub.url, sub.tag) for comp, sub in subcomps if isinstance(comp, GitTagComponent) and sub) # produce summary of submission datetimes if found or always_summary: slugs = list(last_submission.keys()) slugs.sort() summarybuffer = io.StringIO() summarycsv = csv.writer(summarybuffer) summarycsv.writerow([Person.userid_header(), "Last Submission"]) for s in slugs: summarycsv.writerow([ s, last_submission[s].created_at.strftime("%Y/%m/%d %H:%M:%S") ]) z.writestr(prefix + "summary.csv", summarybuffer.getvalue()) summarybuffer.close() # produce git clone-all script if any_git_tags: script = [ '#!/bin/sh', '', '# This script will clone all of the submitted git tags for this activity,', '# putting them into the current directory. This should work in a Linux, OSX,', '# or the Git Bash shell in Windows.', '' ] git_tags.sort() for comp_slug, sub_slug, url, tag in git_tags: dir_name = comp_slug + '_' + sub_slug script.append( 'git clone %s %s && \\\n (cd %s && git checkout tags/%s)' % (quote(url), quote(dir_name), quote(dir_name), quote(tag))) script.append('') z.writestr(prefix + "clone-all.sh", '\n'.join(script))
def generate_submission_contents(self, z, prefix='', always_summary=True): """ Assemble submissions and put in ZIP file. """ self.ensure_components() assert self.submissions is not None assert self.all_submitted_components is not None multi = self.activity.multisubmit() from submission.models.gittag import GitTagComponent any_git_tags = any(isinstance(c, GitTagComponent) for c in self.components) git_tags = [] # Collect all of the SubmittedComponents that we need to output # i.e. the most recent of each by student|group and component found = set() # (student|group, SubmissionComponent) pairs we have already included individual_subcomps = {} # student|group: [(SubmissionComponent, SubmittedComponent)] last_submission = {} # student|group: final Submission for sub, subcomps in self.submissions_and_components(): slug = sub.file_slug() for comp, sc in subcomps: key = (slug, comp.slug) if (not multi and key in found) or sc is None: continue if slug not in last_submission: last_submission[slug] = sub found.add(key) scs = individual_subcomps.get(slug, []) scs.append((comp, sc)) individual_subcomps[sub.file_slug()] = scs # Now add them to the ZIP for slug, subcomps in individual_subcomps.items(): lastsub = last_submission[slug] p = os.path.join(prefix, slug) self._add_to_zip(z, self.activity, subcomps, lastsub.created_at, slug=lastsub.file_slug(), prefix=p, multi=multi) git_tags.extend((comp.slug, slug, sub.url, sub.tag) for comp, sub in subcomps if isinstance(comp, GitTagComponent) and sub) # produce summary of submission datetimes if found or always_summary: slugs = list(last_submission.keys()) slugs.sort() summarybuffer = io.StringIO() summarycsv = csv.writer(summarybuffer) summarycsv.writerow([Person.userid_header(), "Last Submission"]) for s in slugs: summarycsv.writerow([s, last_submission[s].created_at.strftime("%Y/%m/%d %H:%M:%S")]) z.writestr(prefix + "summary.csv", summarybuffer.getvalue()) summarybuffer.close() # produce git clone-all script if any_git_tags: script = ['#!/bin/sh', '', '# This script will clone all of the submitted git tags for this activity,', '# putting them into the current directory. This should work in a Linux, OSX,', '# or the Git Bash shell in Windows.', ''] git_tags.sort() for comp_slug, sub_slug, url, tag in git_tags: dir_name = comp_slug + '_' + sub_slug script.append('git clone %s %s && \\\n (cd %s && git checkout tags/%s)' % ( quote(url), quote(dir_name), quote(dir_name), quote(tag))) script.append('') z.writestr(prefix + "clone-all.sh", '\n'.join(script))
def generate_submission_contents(self, z, prefix='', always_summary=True): """ Assemble submissions and put in ZIP file. """ self.ensure_components() assert self.submissions is not None assert self.all_submitted_components is not None multi = self.activity.multisubmit() from submission.models.gittag import GitTagComponent any_git_tags = any( isinstance(c, GitTagComponent) for c in self.components) git_tags = [] # get SubmittedComponents and metadata found, individual_subcomps, last_submission = self.most_recent_submissions( ) # Now add them to the ZIP for slug, subcomps in individual_subcomps.items(): lastsub = last_submission[slug] p = os.path.join(prefix, slug) self._add_to_zip(z, self.activity, subcomps, lastsub.created_at, slug=lastsub.file_slug(), prefix=p, multi=multi) git_tags.extend((comp.slug, slug, sub.url, sub.tag) for comp, sub in subcomps if isinstance(comp, GitTagComponent) and sub) # produce summary of submission datetimes if found or always_summary: slugs = list(last_submission.keys()) slugs.sort() summarybuffer = io.StringIO() summarycsv = csv.writer(summarybuffer) summarycsv.writerow([Person.userid_header(), "Last Submission"]) for s in slugs: summarycsv.writerow([ s, last_submission[s].created_at.strftime("%Y/%m/%d %H:%M:%S") ]) z.writestr(prefix + "summary.csv", summarybuffer.getvalue()) summarybuffer.close() # produce git clone-all script if any_git_tags: script = [ '#!/bin/sh', '', '# This script will clone all of the submitted git tags for this activity,', '# putting them into the current directory. This should work in a Linux, OSX,', '# or the Git Bash shell in Windows.', '' ] git_tags.sort() for comp_slug, sub_slug, url, tag in git_tags: dir_name = comp_slug + '_' + sub_slug script.append( 'git clone %s %s && \\\n (cd %s && git checkout tags/%s)' % (quote(url), quote(dir_name), quote(dir_name), quote(tag))) script.append('') z.writestr(prefix + "clone-all.sh", '\n'.join(script))