Example #1
0
 def test_OneTimePad_init(self, mock_uuid4):
     user = User(username='******')
     user.save()
     otp = OneTimePad(user=user)
     otp.save()
     otp = OneTimePad.objects.get(pk=otp.id)
     self.assertTrue( (datetime.now() - otp.creation_time).seconds < 1)
     self.assertEquals(otp.user, user)
     self.assertEquals(otp.guid, unicode(mock_uuid4.return_value))
Example #2
0
    def test_api_view_ignores_old_private_key_things(self):
        otp = OneTimePad(user=self.user)
        otp.save()
        otp.creation_time = datetime.today() - timedelta(36000)
        otp.save()
        guid = otp.guid
        self.request.method = 'POST'
        self.request.POST = {pk_name: guid}

        actual = calculate_and_get_json_for_api(
            self.request,
            self.sheet.owner.username,
            self.sheet.id)

        self.assertTrue(isinstance(actual, HttpResponseForbidden))
Example #3
0
 def create_private_key(self):
     self.otp = OneTimePad(user=self.owner)
     self.otp.save()
     return unicode(self.otp.guid)
Example #4
0
class Sheet(models.Model):
    last_modified = models.DateTimeField(auto_now=True)

    version = models.IntegerField(default=0)

    owner = models.ForeignKey(User)
    name = models.TextField(default='Untitled')

    width = models.IntegerField(default=52)
    height = models.IntegerField(default=1000)

    contents_json = models.TextField(default=worksheet_to_json(Worksheet()))

    timeout_seconds = models.IntegerField(default=55)

    is_public = models.BooleanField(default=False)
    allow_json_api_access = models.BooleanField(default=False)
    api_key = models.CharField(max_length=72)

    column_widths_json = models.TextField(default='{}')

    usercode = models.TextField(
        default=dedent("""
            load_constants(worksheet)

            # Put code here if it needs to access constants in the spreadsheet
            # and to be accessed by the formulae.  Examples: imports,
            # user-defined functions and classes you want to use in cells.

            evaluate_formulae(worksheet)

            # Put code here if it needs to access the results of the formulae.
        """)
    )


    def __init__(self, *args, **kwargs):
        models.Model.__init__(self, *args, **kwargs)
        self.column_widths = jsonlib.loads(self.column_widths_json)
        if not self.api_key:
            self.api_key = str(uuid4())

    def __unicode__(self):
        return 'Sheet %d: %s' % (self.id, self.name)


    def create_private_key(self):
        self.otp = OneTimePad(user=self.owner)
        self.otp.save()
        return unicode(self.otp.guid)


    def _delete_private_key(self):
        self.otp.delete()


    def save(self, *args, **kwargs):
        if self.name == 'Untitled':
            models.Model.save(self, *args, **kwargs) # save to set self.id
            self.name = 'Sheet %d' % (self.id,)
        self.column_widths_json = jsonlib.dumps(self.column_widths)
        models.Model.save(self, *args, **kwargs)


    def unjsonify_worksheet(self):
        return worksheet_from_json(self.contents_json)


    def jsonify_worksheet(self, worksheet):
        self.contents_json = worksheet_to_json(worksheet)


    def merge_non_calc_attrs(self, sheet_in_db):
        self.name = sheet_in_db.name
        self.column_widths = sheet_in_db.column_widths


    def calculate(self):
        private_key = self.create_private_key()
        worksheet = self.unjsonify_worksheet()
        transaction.commit()
        try:
            calculate_with_timeout(worksheet, self.usercode, self.timeout_seconds, private_key)
        finally:
            self._delete_private_key()
        self.jsonify_worksheet(worksheet)