コード例 #1
0
ファイル: __init__.py プロジェクト: xhacker/coursys
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()
コード例 #2
0
ファイル: __init__.py プロジェクト: avacariu/coursys
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()
コード例 #3
0
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))
コード例 #4
0
ファイル: __init__.py プロジェクト: vanthaiunghoa/coursys
    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))
コード例 #5
0
ファイル: __init__.py プロジェクト: sfu-fas/coursys
    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))
コード例 #6
0
    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))