123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296 |
- from suds.client import Client
- import datetime
- import os
- import memoQFile
- from base64 import b64decode, b64encode
- import json
- class Languages(object):
- """Encapsulates project languages."""
- def __init__(self):
- self.target = []
- self.source = None
- class Project(object):
- """Encapsulates basic project information."""
- def __init__(self):
- self.__guid = None
- now = datetime.datetime.now()
- self.name = 'Test_{}'.format(str(now).replace(":", "-"))
- self.domain = "Python"
- self.documents = None
- self.languages = Languages()
- self.deadline = now + datetime.timedelta(days=2)
- def get_project_guid(self):
- return self.__guid
- def set_project_guid(self, value):
- self.__guid = value
- def populate_project_info(self, projectInfo):
- """Populates name, domain, languages, deadline from project information as received
- from memoQ server."""
- if projectInfo != None:
- self.name = projectInfo['Name']
- self.domain = projectInfo['Domain']
- self.languages.target.extend(
- [x for x in projectInfo['TargetLanguageCodes'].string])
- self.languages.source = projectInfo['SourceLanguageCode']
- self.deadline = projectInfo['Deadline']
- class MemoQProject(object):
- """Client for memoQ Server projects API."""
- def __init__(self):
- with open("config.json") as json_file:
- self.config = json.load(json_file)
- if self.config["api_base_url"] != "":
- apiURL = self.config["api_base_url"] + \
- "/memoqservices/ServerProject?wsdl"
- self.client = Client(apiURL)
- self.project = Project()
- def __repr__(self):
- if self.project.get_project_guid() != None:
- return "{} - {}\n{} - {}\n{}".format(self.project.name, self.project.get_project_guid(), self.project.languages.source, (", ").join([x for x in self.project.languages.target]), str(self.project.deadline))
- else:
- return "No project!"
- def get_project_by_domain(self, domain):
- """Gets first project of given domain name."""
- filter = self.client.factory.create(
- '{http://kilgray.com/memoqservices/2007}ServerProjectListFilter')
- filter.Domain = domain
- projects = self.client.service.ListProjects(filter)
- if projects:
- self.project.set_project_guid(projects[0][0]['ServerProjectGuid'])
- self.project.populate_project_info(projects[0][0])
- else:
- self.project.set_project_guid(None)
- def get_project_by_guid(self, guid):
- """Gets project information for project of given guid."""
- project_info = self.client.service.GetProject(guid)
- if project_info != None:
- self.project.set_project_guid(guid)
- self.project.populate_project_info(project_info)
- else:
- self.project.set_project_guid(None)
- def template_project_options(self, template_guid):
- """Needs guid of memoQ project template.
- Returns options needed for creating memoQ project from template."""
- if self.project.languages.source != None:
- options = self.client.factory.create(
- '{http://kilgray.com/memoqservices/2007}TemplateBasedProjectCreateInfo')
- options.TemplateGuid = template_guid
- options.Name = self.project.name
- options.SourceLanguageCode = self.project.languages.source
- options.Domain = self.project.domain
- options.CreatorUser = self.config["creator_guid"]
- return options
- else:
- return None
- def create_project_from_template(self, templateGuid):
- """Creates memoQ project from given project template.
- Sets new project as active project on success."""
- options = self.template_project_options(templateGuid)
- if options != None:
- result = self.client.service.CreateProjectFromTemplate(options)
- if result.ResultStatus == "Success":
- self.get_project_by_guid(result.ProjectGuid)
- else:
- self.project.set_project_guid(None)
- def project_options(self):
- """Returns options needed for creating memoQ project."""
- if len(self.project.languages.target) and self.project.languages.source != None:
- options = self.client.factory.create(
- '{http://kilgray.com/memoqservices/2007}ServerProjectDesktopDocsCreateInfo')
- options.Name = self.project.name
- options.SourceLanguageCode = self.project.languages.source
- options.TargetLanguageCodes.string = self.project.languages.target
- options.Deadline = self.project.deadline
- options.RecordVersionHistory = True
- options.CreatorUser = self.config["creator_guid"]
- resources = self.client.factory.create(
- '{http://schemas.datacontract.org/2004/07/MemoQServices}ServerProjectResourcesInPackages')
- options.PackageResourceHandling.value = resources.LinkRemote
- return options
- else:
- return None
- def create_project(self):
- """Creates memoQ project. Sets new project as active project on success."""
- options = self.project_options()
- if options != None:
- project_guid = self.client.service.CreateProject2(options)
- if project_guid != None:
- self.get_project_by_guid(project_guid)
- else:
- self.project.set_project_guid(None)
- def import_document(self, path):
- """Uploads and then imports given file to active project for all target languages.
- Returns true on success."""
- file_client = memoQFile.MemoQFile()
- file_guid = file_client.upload_file(path)
- if file_guid == None:
- return False
- langs = self.client.factory.create(
- '{http://kilgray.com/memoqservices/2007}targetLangCodes')
- langs.string = self.project.languages.target
- result = self.client.service.ImportTranslationDocument(
- self.project.get_project_guid(), file_guid, langs)
- if result != None:
- return True
- else:
- return False
- def get_project_documents(self):
- """Gets list of documents from active project."""
- options = self.client.factory.create(
- '{http://kilgray.com/memoqservices/2007}ListServerProjectTranslationDocument2Options')
- options.FillInAssignmentInformation = True
- if self.project.get_project_guid() != None:
- self.documents = self.client.service.ListProjectTranslationDocuments2(
- self.project.get_project_guid(), options)
- def document_guids(self):
- """Returns guids of documents from active project."""
- if self.documents == None:
- self.get_project_documents()
- return [x.DocumentGuid for x in self.documents[0]]
- def print_documents(self):
- """Prints basic information on documents from active project."""
- if self.documents == None:
- self.get_project_documents()
- for document in self.documents[0]:
- print("{} ({}) - {}\n".format(document.DocumentName,
- document.TargetLangCode, document.DocumentGuid))
- def export_documents(self, path):
- """Exports all documents from active project to given path.
- Prints path to each file on success and returns true."""
- if self.project.get_project_guid() == None:
- return "No project!"
- if self.project.documents == None:
- self.get_project_documents()
- export_results = []
- for guid in self.document_guids():
- export_results.append(
- self.client.service.ExportTranslationDocument(self.project.get_project_guid(), guid))
- file_client = memoQFile.MemoQFile()
- if len(export_results):
- for document in export_results:
- print(file_client.download_file(path, document.FileGuid))
- return True
- else:
- return False
- def export_documents2(self, path):
- """Exports all documents from active project to given path using extended method.
- Prints path to each file on success and returns true."""
- if self.project.get_project_guid() == None:
- return "No project!"
- if self.documents == None:
- self.get_project_documents()
- options = self.client.factory.create(
- '{http://kilgray.com/memoqservices/2007}DocumentExportOptions')
- options.CopySourceToEmptyTarget = True
- export_results = []
- for guid in self.document_guids():
- export_results.append(self.client.service.ExportTranslationDocument2(
- self.project.get_project_guid(), guid, options))
- file_client = memoQFile.MemoQFile()
- if len(export_results):
- for document in export_results:
- print(file_client.download_file(path, document.FileGuid))
- return True
- else:
- return False
- def statistics_options(self):
- """Returns options for statistics."""
- options = self.client.factory.create(
- '{http://kilgray.com/memoqservices/2007}StatisticsOptions')
- options.Analysis_ProjectTMs = True
- options.Analysis_Homogenity = True
- options.ShowResultsPerFile = True
- options.RepetitionPreferenceOver100 = True
- statistics_algorithm = self.client.factory.create(
- '{http://schemas.datacontract.org/2004/07/MemoQServices}StatisticsAlgorithm')
- options.Algorithm.value = statistics_algorithm.MemoQ
- return options
- def run_statistics(self):
- """Returns statistics for all documents and language combinations of active project,
- none on failure."""
- options = self.statistics_options()
- statistics_format = self.client.factory.create(
- '{http://schemas.datacontract.org/2004/07/MemoQServices}StatisticsResultFormat')
- languages = self.client.factory.create(
- '{http://kilgray.com/memoqservices/2007}targetLangCodes')
- languages.string = self.project.languages.target
- try:
- stats = self.client.service.GetStatisticsOnProject(
- self.project.get_project_guid(), languages, options, statistics_format.CSV_MemoQ)
- if stats.ResultStatus == "Success":
- return stats
- else:
- return None
- except Exception as e:
- print(str(e))
- def save_statistics(self, path):
- """Saves statictis to given path (one file per language combination).
- Returns path to statistics file(s)."""
- statistics = self.run_statistics()
- if statistics != None:
- for stat in statistics.ResultsForTargetLangs.StatisticsResultForLang:
- output_file = '{}_{}.csv'.format(
- stat.TargetLangCode, self.project.name)
- with open(output_file, 'wb') as target:
- target.write(b64decode(stat.ResultData))
- filename = '{}_{}.csv'.format(
- stat.TargetLangCode, self.project.name)
- output_file = os.path.join(path, filename)
- with open(output_file, 'wb') as target:
- # Statistics are base64 and utf-16 encoded, so we need to
- # decode first
- stat_data = b64decode(stat.ResultData).decode("utf-16")
- # Changing delimiter to ,
- stat_data = stat_data.replace(";", ",")
- target.write(stat_data.encode("utf-8"))
- return output_file
- def delete(self):
- """Deletes active project permamently. WARNING! Not possible to recover!"""
- self.client.service.DeleteProject(self.project.get_project_guid())
|