Ignore:
Timestamp:
05/23/13 17:35:04 (11 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Refactored scheme save methods. Added common error handing.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/application/canvasmain.py

    r11544 r11545  
    10581058        document = self.current_document() 
    10591059        curr_scheme = document.scheme() 
    1060  
    1061         if document.path() and self.check_can_save(document, document.path()): 
    1062             curr_scheme.save_to(open(document.path(), "wb"), 
    1063                                 pretty=True, pickle_fallback=True) 
    1064  
    1065             document.setModified(False) 
    1066             self.add_recent_scheme(curr_scheme.title, document.path()) 
    1067             return QDialog.Accepted 
     1060        path = document.path() 
     1061 
     1062        if path and self.check_can_save(document, path): 
     1063            if self.save_scheme_to(curr_scheme, path): 
     1064                document.setModified(False) 
     1065                self.add_recent_scheme(curr_scheme.title, document.path()) 
     1066                return QDialog.Accepted 
     1067            else: 
     1068                return QDialog.Rejected 
    10681069        else: 
    10691070            return self.save_scheme_as() 
    10701071 
    10711072    def save_scheme_as(self): 
    1072         """Save the current scheme by asking the user for a filename. 
    1073         Return QFileDialog.Accepted if the scheme was saved successfully 
    1074         and QFileDialog.Rejected if not. 
     1073        """ 
     1074        Save the current scheme by asking the user for a filename. Return 
     1075        `QFileDialog.Accepted` if the scheme was saved successfully and 
     1076        `QFileDialog.Rejected` if not. 
    10751077 
    10761078        """ 
     
    11011103                return QDialog.Rejected 
    11021104 
    1103             dirname, basename = os.path.split(filename) 
    1104             self.last_scheme_dir = dirname 
    1105  
    1106             try: 
    1107                 curr_scheme.save_to(open(filename, "wb"), 
    1108                                     pretty=True, pickle_fallback=True) 
    1109             except Exception: 
    1110                 log.error("Error saving %r to %r", curr_scheme, filename, 
    1111                           exc_info=True) 
    1112                 # Also show a message box 
    1113                 # TODO: should handle permission errors with a 
    1114                 # specialized messages. 
    1115                 message_critical( 
    1116                      self.tr('An error occurred while trying to save scheme ' 
    1117                              '"%s" to "%s"') % (title, basename), 
    1118                      title=self.tr("Error saving %s") % basename, 
    1119                      exc_info=True, 
    1120                      parent=self) 
    1121                 return QFileDialog.Rejected 
    1122  
    1123             document.setPath(filename) 
    1124  
    1125             document.setModified(False) 
    1126             self.add_recent_scheme(curr_scheme.title, document.path()) 
    1127             return QFileDialog.Accepted 
    1128         else: 
    1129             return QFileDialog.Rejected 
     1105            self.last_scheme_dir = os.path.dirname(filename) 
     1106 
     1107            if self.save_scheme_to(curr_scheme, filename): 
     1108                document.setPath(filename) 
     1109                document.setModified(False) 
     1110                self.add_recent_scheme(curr_scheme.title, document.path()) 
     1111 
     1112                return QFileDialog.Accepted 
     1113 
     1114        return QFileDialog.Rejected 
     1115 
     1116    def save_scheme_to(self, scheme, filename): 
     1117        """ 
     1118        Save a Scheme instance `scheme` to `filename`. On success return 
     1119        `True`, else show a message to the user explaining the error and 
     1120        return `False`. 
     1121 
     1122        """ 
     1123        dirname, basename = os.path.split(filename) 
     1124        self.last_scheme_dir = dirname 
     1125        title = scheme.title or "untitled" 
     1126        try: 
     1127            scheme.save_to(open(filename, "wb"), 
     1128                           pretty=True, pickle_fallback=True) 
     1129            return True 
     1130        except (IOError, OSError) as ex: 
     1131            log.error("%s saving '%s'", type(ex).__name__, filename, 
     1132                      exc_info=True) 
     1133            if ex.errno == 2: 
     1134                # user might enter a string containing a path separator 
     1135                message_warning( 
     1136                    self.tr('Scheme "%s" could not be saved. The path does ' 
     1137                            'not exist') % title, 
     1138                    title="", 
     1139                    informative_text=self.tr("Choose another location."), 
     1140                    parent=self 
     1141                ) 
     1142            elif ex.errno == 13: 
     1143                message_warning( 
     1144                    self.tr('Scheme "%s" could not be saved. You do not ' 
     1145                            'have write permissions.') % title, 
     1146                    title="", 
     1147                    informative_text=self.tr( 
     1148                        "Change the file system permissions or choose " 
     1149                        "another location."), 
     1150                    parent=self 
     1151                ) 
     1152            else: 
     1153                message_warning( 
     1154                    self.tr('Scheme "%s" could not be saved.') % title, 
     1155                    title="", 
     1156                    informative_text=ex.strerror, 
     1157                    exc_info=True, 
     1158                    parent=self 
     1159                ) 
     1160            return False 
     1161 
     1162        except Exception: 
     1163            log.error("Error saving %r to %r", scheme, filename, exc_info=True) 
     1164            message_critical( 
     1165                self.tr('An error occurred while trying to save scheme ' 
     1166                        '"%s" to "%s"') % (title, basename), 
     1167                title=self.tr("Error saving %s") % basename, 
     1168                exc_info=True, 
     1169                parent=self 
     1170            ) 
     1171            return False 
    11301172 
    11311173    def get_started(self, *args): 
Note: See TracChangeset for help on using the changeset viewer.