diff --git a/Code/Mantid/scripts/Inelastic/Direct/ISISDirecInelasticConfig.py b/Code/Mantid/scripts/Inelastic/Direct/ISISDirecInelasticConfig.py index 8403930a7c1a..2ac4f3b5b7db 100644 --- a/Code/Mantid/scripts/Inelastic/Direct/ISISDirecInelasticConfig.py +++ b/Code/Mantid/scripts/Inelastic/Direct/ISISDirecInelasticConfig.py @@ -3,7 +3,8 @@ import shutil import re import copy -from datetime import date,time +from datetime import date +import time # the list of instruments this configuration is applicable to INELASTIC_INSTRUMENTS = ['MAPS','LET','MERLIN','MARI','HET'] @@ -18,7 +19,7 @@ def __init__(self): self.cycle_IDlist={} self.start_dates = {} self._recent_dateID=None - +# def set_user_properties(self,instrument,start_date,cycle,rb_folder): """Define the information, user office provides about user. The info has the form: instrument -- string with full instrument name @@ -44,26 +45,28 @@ def set_user_properties(self,instrument,start_date,cycle,rb_folder): max_date = a_date else: self._recent_dateID = recent_date_id +# def get_start_date(self): """Last start date""" if self._recent_dateID: return self.start_dates[self._recent_dateID] else: raise RuntimeError("User's experiment date is not defined. User undefined") +# def get_last_instrument(self): """return instrument used in last actual experiment""" if self._recent_dateID: return self.instrument[self._recent_dateID] else: raise RuntimeError("User's experiment date is not defined. User undefined") - +# def get_last_rbdir(self): """return rb folder used in last actual instrument""" if self._recent_dateID: return self.rb_dir[self._recent_dateID] else: raise RuntimeError("User's experiment date is not defined. User undefined") - +# def get_last_cycleID(self): """return last cycle the user is participating""" if self._recent_dateID: @@ -74,14 +77,19 @@ def get_last_cycleID(self): def check_input(self,instrument,start_date,cycle,rb_folder): """Verify that input is correct""" if not instrument in INELASTIC_INSTRUMENTS: - raise RuntimeError("Instrument {0} has to be one of ISIS inelastic instruments".format(instrument)) + raise RuntimeError("Instrument {0} has to be one of "\ + "ISIS inelastic instruments".format(instrument)) if not (isinstance(start_date,str) and len(start_date) == 8): - raise RuntimeError("Experiment start date {0} should be defined as a sting in the form YYYYMMDD but it is not".format(start_date)) + raise RuntimeError("Experiment start date {0} should be defined as"\ + " a sting in the form YYYYMMDD but it is not".format(start_date)) if not (isinstance(cycle,str) and len(cycle) == 10 and re.match('^CYCLE',cycle)) : - raise RuntimeError("Cycle {0} should have form CYCLEYYYYN where N-- the cycle's number in a year but it is not".format(cycle)) + raise RuntimeError("Cycle {0} should have form CYCLEYYYYN where "\ + "N-- the cycle's number in a year but it is not".format(cycle)) if not (os.path.exists(rb_folder) and os.path.isdir(rb_folder)): raise RuntimeError("Folder {0} have to exist".format(rb_folder)) - +# +#--------------------------------------------------------------------# +# class MantidConfigDirectInelastic(object): """Class describes Mantid server specific user's configuration, necessary for Direct Inelastic reduction and analysis to work @@ -179,8 +187,11 @@ def __init__(self,mantid='/opt/Mantid/',home='/home/',\ # Its contents is generated by _init_config method from server and user specific # input parameters together. self._dynamic_configuration = None + # Unconditionally rewrite Mantid Configuration self._force_change_config = False - + # Unconditionally rewrite copy of sample reduction script + self._force_change_script = False +# def config_need_replacing(self,config_file_name): """Method specifies conditions when existing configuration file should be replaced""" if self._force_change_config: @@ -194,10 +205,29 @@ def config_need_replacing(self,config_file_name): return True else: return False - +# + def script_need_replacing(self,source_script_name,target_script_name): + """Method specifies conditions when existing reduction file should be replaced + by a sample file. + """ + if self._force_change_script: + return True + # non-existing file should always be replaced + if not os.path.isfile(target_script_name): + return True + #Always replace sample file if it has not been touched + start_date = self._user.get_start_date() + # this time is set up to the file, copied from the repository + sample_file_time = time.mktime(start_date.timetuple()) + targ_file_time = os.path.getmtime(target_script_name) + if sample_file_time == targ_file_time: + return True + else: # somebody have modified the target file. Leave it alone + return False +# def copy_reduction_sample(self,InstrName,CycleID,rb_folder): - """ Method copies sample reduction script from user script repository - to user folder. + """Method copies sample reduction script from user script repository + to user folder. """ source_file = self._sample_reduction_file(InstrName) @@ -210,13 +240,20 @@ def copy_reduction_sample(self,InstrName,CycleID,rb_folder): target_file = self._target_reduction_file(InstrName,CycleID) full_target = os.path.join(rb_folder,target_file) - # already have target file - if os.path.isfile(full_target): + # already have target file or modified by user + if not self.script_need_replacing(full_source,full_target): return + if os.path.isfile(full_target): + os.remove(full_target) shutil.copyfile(full_source,full_target) os.chmod(full_target,0777) + if platform.system() != 'Windows': os.system('chown '+self._fedid+':'+self._fedid+' '+full_target) + # Set up the file creation and modification dates to the users start date + start_date = self._user.get_start_date() + file_time = time.mktime(start_date.timetuple()) + os.utime(full_target,(file_time,file_time)) def get_data_folder_name(self,instr,cycle_ID): @@ -381,8 +418,3 @@ def _write_user_config_file(self,config_file_name): os.system('chown -R {0}:{0} {1}'.format(self._fedid,config_file_name)) - -def copy_and_overwrite(from_path, to_path): - if os.path.exists(to_path): - shutil.rmtree(to_path) - shutil.copytree(from_path, to_path) diff --git a/Code/Mantid/scripts/test/ISISDirecInelasticConfigTest.py b/Code/Mantid/scripts/test/ISISDirecInelasticConfigTest.py index 82b402646ebe..a05404a48040 100644 --- a/Code/Mantid/scripts/test/ISISDirecInelasticConfigTest.py +++ b/Code/Mantid/scripts/test/ISISDirecInelasticConfigTest.py @@ -1,5 +1,5 @@ import os -#os.environ["PATH"] = r"c:/Mantid/Code/builds/br_master/bin/Release;"+os.environ["PATH"] +os.environ["PATH"] = r"c:/Mantid/Code/builds/br_master/bin/Release;"+os.environ["PATH"] import unittest import shutil import datetime @@ -51,7 +51,7 @@ def setUp(self): if not os.path.exists(self.userRootDir): os.makedirs(self.userRootDir) - def makeFakeSourceReductionFile(self,mcf): + def makeFakeSourceReductionFile(self,mcf,contents=None): instr_name = mcf._user.get_last_instrument() @@ -61,10 +61,13 @@ def makeFakeSourceReductionFile(self,mcf): file_name = mcf._sample_reduction_file(instr_name) full_file = os.path.join(file_path,file_name) - if not os.path.isfile(full_file): - fh=open(full_file,'w') - fh.write('#Test reduction file') - fh.close() + if os.path.isfile(full_file): + os.remove(full_file) + fh=open(full_file,'w') + fh.write('#Test reduction file\n') + fh.write('Contents={0}'.format(contents)) + fh.close() + return full_file def tearDown(self): @@ -181,7 +184,8 @@ def test_build_3Experiments_config(self): rbnum2='RB1999000' - targetDir = config['defaultsave.directory'] + + targetDir = self.get_save_dir() rbdir2 = os.path.join(targetDir,self.userID,rbnum2) if not os.path.exists(rbdir2): os.makedirs(rbdir2) @@ -200,7 +204,7 @@ def test_build_3Experiments_config(self): mcf.init_user(self.userID,user) - self.makeFakeSourceReductionFile(mcf) + fake_source=self.makeFakeSourceReductionFile(mcf) self.assertEqual(len(mcf._dynamic_configuration),6) self.assertEqual(mcf._dynamic_configuration[1],'default.instrument=MERLIN') @@ -223,10 +227,10 @@ def test_build_3Experiments_config(self): os.makedirs(user1RootDir) # user1 = UserProperties() - user1.set_user_properties('MARI','20000124','CYCLE20001',rbdir2) + user1.set_user_properties('MARI','20990124','CYCLE20991',rbdir2) mcf.init_user(user1ID,user1) - self.makeFakeSourceReductionFile(mcf) + source_file = self.makeFakeSourceReductionFile(mcf) mcf.generate_config() self.assertEqual(len(mcf._dynamic_configuration),6) @@ -234,6 +238,23 @@ def test_build_3Experiments_config(self): config_file = os.path.join(self.userRootDir,'.mantid','Mantid.user.properties') self.assertTrue(os.path.exists(os.path.join(user1RootDir,'.mantid'))) self.assertTrue(os.path.exists(config_file)) + # + # Check sample reduction file + # + full_rb_path = rbdir2 + cycle_id = user1.get_last_cycleID() + instr = user1.get_last_instrument() + target_file = mcf._target_reduction_file(instr,cycle_id) + full_target_file = os.path.join(full_rb_path,target_file) + self.assertTrue(os.path.exists(full_target_file)) + # Fresh target file should always be replaced + self.assertTrue(mcf.script_need_replacing(source_file,full_target_file)) + # modify target file access time: + access_time = os.path.getmtime(full_target_file) + now = time.time() + os.utime(full_target_file,(access_time ,now)) + # should not replace modified target file + self.assertFalse(mcf.script_need_replacing(source_file,full_target_file)) #-------------------------------------------------------------------- # clean up