~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to ivle/database.py

Cache worksheet and exercise rST-generated XHTML in the DB, accelerating rendering by up to 2000%.

Show diffs side-by-side

added added

removed removed

Lines of Context:
889
889
    id = Unicode(primary=True, name="identifier")
890
890
    name = Unicode()
891
891
    description = Unicode()
 
892
    _description_xhtml_cache = Unicode(name='description_xhtml_cache')
892
893
    partial = Unicode()
893
894
    solution = Unicode()
894
895
    include = Unicode()
937
938
 
938
939
        return perms
939
940
 
940
 
    def get_description(self):
941
 
        """Return the description interpreted as reStructuredText."""
942
 
        return rst(self.description)
 
941
    def _cache_description_xhtml(self, invalidate=False):
 
942
        # Don't regenerate an existing cache unless forced.
 
943
        if self._description_xhtml_cache is not None and not invalidate:
 
944
            return
 
945
 
 
946
        if self.description:
 
947
            self._description_xhtml_cache = rst(self.description)
 
948
        else:
 
949
            self._description_xhtml_cache = None
 
950
 
 
951
    @property
 
952
    def description_xhtml(self):
 
953
        """The XHTML exercise description, converted from reStructuredText."""
 
954
        self._cache_description_xhtml()
 
955
        return self._description_xhtml_cache
 
956
 
 
957
    def set_description(self, description):
 
958
        self.description = description
 
959
        self._cache_description_xhtml(invalidate=True)
943
960
 
944
961
    def delete(self):
945
962
        """Deletes the exercise, providing it has no associated worksheets."""
964
981
    assessable = Bool()
965
982
    published = Bool()
966
983
    data = Unicode()
 
984
    _data_xhtml_cache = Unicode(name='data_xhtml_cache')
967
985
    seq_no = Int()
968
986
    format = Unicode()
969
987
 
1016
1034
 
1017
1035
        return perms
1018
1036
 
1019
 
    def get_xml(self):
1020
 
        """Returns the xml of this worksheet, converts from rst if required."""
1021
 
        if self.format == u'rst':
1022
 
            ws_xml = rst(self.data)
1023
 
            return ws_xml
 
1037
    def _cache_data_xhtml(self, invalidate=False):
 
1038
        # Don't regenerate an existing cache unless forced.
 
1039
        if self._data_xhtml_cache is not None and not invalidate:
 
1040
            return
 
1041
 
 
1042
        if self.format == u'rst':
 
1043
            self._data_xhtml_cache = rst(self.data)
 
1044
        else:
 
1045
            self._data_xhtml_cache = None
 
1046
 
 
1047
    @property
 
1048
    def data_xhtml(self):
 
1049
        """The XHTML of this worksheet, converted from rST if required."""
 
1050
        # Update the rST -> XHTML cache, if required.
 
1051
        self._cache_data_xhtml()
 
1052
 
 
1053
        if self.format == u'rst':
 
1054
            return self._data_xhtml_cache
1024
1055
        else:
1025
1056
            return self.data
1026
1057
 
 
1058
    def set_data(self, data):
 
1059
        self.data = data
 
1060
        self._cache_data_xhtml(invalidate=True)
 
1061
 
1027
1062
    def delete(self):
1028
1063
        """Deletes the worksheet, provided it has no attempts on any exercises.
1029
1064