testappproj/testapp/helpers/bulkuploader.py
author amit@thunder
Mon, 17 May 2010 22:33:59 +0530
changeset 0 0b061d58aea3
permissions -rw-r--r--
First commit to Fossee of testapp has the basic Pykata framework on django with some specific changes to Problems model and some views to suit an exam like system

# UploadFormat Parser -- test version
#                                       -- ideamonk

class Submission():
  """
  A helper class for bulk uploads. It parses the given chunk of bulk
  upload and tries to submit them to PyKata
  """
  def __init__(self, bulk_text):
    # initialize everything as default/blank as some things might not be
    # present in submission
    self.data_dict = dict()
    self.bulk_text = bulk_text
    self.multiline_fields = ('description', 'examples')
    self.data_dict['user_id'] = ''

  def __getitem__(self, key):
    try:
      return self.data_dict[key]
    except :
      return None

  def __setitem__(self, key, item):
    # mapping to match form submission for code reuse
    if key=='pubTests':
      key = 'tests'
    if key=='privTests':
      key='other_tests'
    if key=='userID':
      key='user_id'

    self.data_dict[key] = item

  def __str__(self):
    return str(self.bulk_text)

  def parse(self):
    """ Parses a problem submission into data fillable in the submission
    form
    """
    chunks = self.bulk_text.split('#-')
    for chunk in chunks[1:]:
      # ^^ ignores the first comment line of the problem
      chunk_key, chunk_data = chunk.split(':',1)
      chunk_key = chunk_key.strip()
      if chunk_key in self.multiline_fields:
        # these are data surrounded in triple quotes, single or double
        chunk_data = eval(chunk_data).strip('\r\n')
      else:
        chunk_data = chunk_data.strip().strip('\r\n')
      self[chunk_key] = chunk_data

  def talk(self):
    """ Just a testing function, a submission talks about itself to everyone
    """
    print "Hi I am a submission problem on PyKata,"
    print "Let me tell you something about myself - "
    print "I was created by -", self['userID']
    print "My name is -", self['name']
    print "I belong to these categories -", self['categories']
    print "Here, something more about myself --"
    print self['description']
    print "---------------------------------------"
    print "My solution --"
    print self['solution']
    print "----------------------------------------"
    print "My skeleton --"
    print self['skeleton']
    print "----------------------------------------"
    print "Public Tests --"
    print self['pubTests']
    print "----------------------------------------"
    print "Private Tests --"
    print self['privTests']
    print "----------------------------------------"
    print "\n So tell me something about you too?"


def test_submission_parse():
  import urllib2
#  example_file = urllib2.urlopen('http://ideamonk.in/code/foo.py').read()
  example_file = open('/home/amit/foo2.py').read()
  example_submissions = example_file.split('#---')[1:-1]
  # ^^ ignore the first null string and last __main__ test code
  print example_submissions  
  example_submissions = [ Submission(x) for x in example_submissions ]
  
  for key, a_submission in enumerate(example_submissions):
    print "Problem #", key, "parsed as --"
    print "*************************************************************"
    a_submission.parse()
    a_submission.talk()

if __name__=='__main__':
  # testing
  test_submission_parse()