lionbridge_content_api_test-8.x-4.0/tmgmt_contentapi/tmgmt_contentapi.module

tmgmt_contentapi/tmgmt_contentapi.module
<?php /** @noinspection PhpUnusedParameterInspection */

use Drupal\Core\Form\FormStateInterface;
use Drupal\Component\Utility\Xss;
use Drupal\file\Entity\File;
use Drupal\tmgmt\Entity\Job;
use Drupal\tmgmt\Entity\JobItem;
use Drupal\tmgmt\JobInterface;
use Drupal\tmgmt\TranslatorInterface;
use Drupal\tmgmt_contentapi\Util\GeneralHelper;
use Drupal\tmgmt_contentapi\Util\ConentApiHelper;
use Drupal\tmgmt_contentapi\Swagger\Client\Api\ProviderApi;
use Drupal\tmgmt_contentapi\Swagger\Client\Api\JobApi;
use Drupal\tmgmt_contentapi\Swagger\Client\Model\ArrayOfRequestIds;
use Drupal\tmgmt_contentapi\Swagger\Client\Api\RequestApi;
use Drupal\tmgmt_contentapi\Swagger\Client\Api\FileApi;
use Drupal\tmgmt_contentapi\Swagger\Client\Api\SourceFileApi;
use Drupal\tmgmt_contentapi\Swagger\Client\Api\TranslationMemoryApi;

use Drupal\tmgmt_contentapi\Swagger\Client\Model\StatusCodeEnum;
use Drupal\tmgmt_contentapi\Swagger\Client\Model\CreateRequestUpdateTM;

use Drupal\tmgmt_contentapi\Swagger\Client\Configuration;
use Drupal\tmgmt_contentapi\Plugin\tmgmt_contentapi\Format\Xliff;


/**
 * @contentapi
 * Module file of the translation management module.
 */


/**
 * Import form submit callback.
 */
function tmgmt_contentapi_import_form_submit(array $form, FormStateInterface $form_state) {
  // Ensure we have the file uploaded.
  $job = $form_state->getFormObject()->getEntity();
  if ($file = file_save_upload('file', array('file_validate_extensions' => array('xlf')), FALSE, 0)) {
    $extension = pathinfo($file->getFileUri(), PATHINFO_EXTENSION);
    $plugin = new Xliff();
    if ($plugin) {
      // Validate the file on job.
      $validated_job = $plugin->validateImport($file->getFileUri(), $job);
      if (!$validated_job) {
        $job->addMessage('Failed to validate file, import aborted.', array(), 'error');
      }
      elseif ($validated_job->id() != $job->id()) {
        $job->addMessage('The imported file job id @file_id does not match the job id @job_id.', array(
          '@file_id' => $validated_job->id(),
          '@job_id' => $job->id(),
        ), 'error');
      }
      else {
        try {
          // Validation successful, start import.
          // Check if it makes sense to check only the active state here?
          GeneralHelper::resetJobandItemsToActive($job,$file);
          $job->addTranslatedData($plugin->import($file->getFileUri()));
          $job->addMessage('Successfully imported file.');
          ConentApiHelper::checkJobFinishAndApproveRemote($job);
        } catch (Exception $e) {
          $job->addMessage('File import failed with the following message: @message', array('@message' => $e->getMessage()), 'error');
        }
      }
    }
  }
  tmgmt_write_request_messages($job);
}

function tmgmt_contentapi_semi_import_form_submit(array $form, FormStateInterface $form_state) {
  $job = $form_state->getFormObject()->getEntity();
  $translator = $job->getTranslator();
  if($translator){
    try{
      tmgmt_contentapi_downlaod_data_from_contentapi_by_job($translator,$job);
    }
    catch (Exception $exception){
      $job->addMessage('Files could not be downlaoded or imported, see error message: '.$exception->getMessage());
    }
  }
  tmgmt_write_request_messages($job);
}

function tmgmt_contentapi_update_tm_form_submit(array $form, FormStateInterface $form_state){
  $job = $form_state->getFormObject()->getEntity();
  $translator = $job->getTranslator();
  if($translator && $job->getState() == Job::STATE_FINISHED){
    $createdcpjob = NULL;
    $token = NULL;
    $zipPath = NULL;
    $ziparchive = NULL;
    $jobapi = NULL;
    $allfilespath = NULL;
    try {
      // Message which will be displayed using drupa_set_message to disaplay download.
      $messageTopass = 'TM update request successfully submitted.<br/>Exported files can be downoaded here:<br/>';
      $contentapisettings = $translator->getSetting("capi-settings");
      $oneexportfile = $translator->getSetting("one_export_file");
      $token = $contentapisettings['token'];
      // Export files: gernerate paths and other variables.
      $exporter = new Xliff();
      $filesystem = \Drupal::service('file_system');
      $joblabel = GeneralHelper::getJobLabelNoSpeChars($job);
      $dirnameallfiles = $joblabel . '_tmupdate_' . $job->id() . "_" . $job->getRemoteSourceLanguage() . "_" . $job->getRemoteTargetLanguage();
      $zipName = 'zip_job_' . $dirnameallfiles . '.zip';
      $allfilespath = $job->getSetting('scheme') . '://tmgmt_contentapi/LioxSentFiles/' . $dirnameallfiles;
      $zipPath = $allfilespath . "/" . $zipName;
      $filearraytodelte = array();
      $filearrayexportedfiles = array();
      $transferfiles = array();
      // Create folder where all exported files will be stored.
      if (file_prepare_directory($allfilespath, FILE_CREATE_DIRECTORY)) {
        // Export each item of the job in same file.
        if($oneexportfile){
          $labelname = $joblabel;
          $name = $labelname . "_" . $job->id() . "_all_"  . $job->getRemoteSourceLanguage() . '_' . $job->getRemoteTargetLanguage() . '.xlf';
          $jobpath = $allfilespath . "/" . $name;
          $file = file_save_data($exporter->export($job), $jobpath, FILE_EXISTS_REPLACE);
          $filearraytodelte[] = $file;
          $filearrayexportedfiles['all'] = $file;
        }
        else {
          // Export each item of the job in separate file.
          foreach ($job->getItems() as $item) {
            $labelname = GeneralHelper::getStringNoSpeChars($item->label());
            $name = $labelname . "_" . $job->id() . "_" . $item->id() . "_" . $job->getRemoteSourceLanguage() . '_' . $job->getRemoteTargetLanguage() . '.xlf';
            $itempath = $allfilespath . "/" . $name;
            $file = file_save_data($exporter->exportItem($item), $itempath, FILE_EXISTS_REPLACE);
            $filearraytodelte[] = $file;
            $filearrayexportedfiles[$item->id()] = $file;
          }
        }
        // Zip the exported files.
        $ziparchive = new ZipArchive();
        $openresult = $ziparchive->open($filesystem->realpath($zipPath), ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
        $zipcloseresult = FALSE;
        if ($openresult) {
          foreach ($filearrayexportedfiles as $tempfile) {
            $ziparchive->addFile($filesystem->realpath($tempfile->getFileUri()), $tempfile->getFilename());
          }
          $zipcloseresult = $ziparchive->close();
          if ($zipcloseresult) {
            $zipfileobj = GeneralHelper::createFileObject($zipPath);
            \Drupal::service('file.usage')->add($zipfileobj, 'tmgmt_contentapi', 'tmgmt_job', $job->id());
          }
        }
        else {

        }

        $transferfiles = $filearrayexportedfiles;

        // Create Job in Content API.
        $contentapibundle = array();
        $jobapi = new JobApi();
        // Upload files from transferfiles array to CPA.
        $fileapi = new SourceFileApi();
        // Array to store temporally translation requst and associated files.
        $contentapitrrequstfiles = array();
        foreach ($transferfiles as $id => $tmpfile) {
          $data = array();
          $data["job_id"] = GeneralHelper::getCpJobIdfromLocJob($job);
          $data["filename"] = $tmpfile->getFilename();
          $data["filetype"] = $tmpfile->getMimeType();
          $stmrg = \Drupal::service('stream_wrapper_manager')->getViaUri($tmpfile->getFileUri());
          $extpath = $stmrg->realpath();
          $filrequst = new SplFileObject($extpath);
          //unarchive job, if archived
          $actualcpjobinfo = $jobapi->jobsJobIdGet($token,GeneralHelper::getCpJobIdfromLocJob($job));
          $wasarchived = $actualcpjobinfo->getArchived();
          if($wasarchived){
            $jobapi->jobsJobIdUnarchivePut($token, GeneralHelper::getCpJobIdfromLocJob($job));
          }
          $contentapitmpfile = $fileapi->jobsJobIdUploadPost($token, $data["job_id"], $data["filename"], $data["filetype"], $filrequst);
          $tmupdateapi = new TranslationMemoryApi();
          $tmupdaterequest = new CreateRequestUpdateTM(
            array(
              'file_id' => $contentapitmpfile->getFileId(),
              'source_native_language_code' => $job->getRemoteSourceLanguage(),
              'target_native_language_code' => $job->getRemoteTargetLanguage()
            ));
          $tmupdateresponse = $tmupdateapi->jobsJobIdTmUpdatefilePut($token,GeneralHelper::getCpJobIdfromLocJob($job), $tmupdaterequest);
          $contentapibundle[] = $createdcpjob;
        }

        if ($wasarchived) {
          // arvhive cpjob if it was archived before
          $jobapi->jobsJobIdArchivePut($token, GeneralHelper::getCpJobIdfromLocJob($job));
        }
        foreach ($filearraytodelte as $tempfile) {
          file_unmanaged_delete($tempfile->getFileUri());
        }
        $messageTopass .= '<a href="' . file_create_url($zipPath) . '">' . Xss::filter(GeneralHelper::getJobLabelNoSpeChars($job)) . '</a>';
        drupal_set_message(\Drupal\Core\Render\Markup::create($messageTopass));
      }
      else {
        throw new \Exception("Could not create directory for export: " . $allfilespath);
      }
    }
    catch (\Exception $exception) {
      // If exception occurs, clean up everything: delete exported files, cancel job in CA if any.
      foreach ($filearraytodelte as $tempfile) {
        if (file_exists($tempfile->getFileUri())) {
          file_unmanaged_delete($tempfile->getFileUri());
        }
      }
      if (!file_exists($zipPath) && $ziparchive != NULL) {
        $ziparchive->close();
      }
      // TODO: Check why zip cannot be deleted. But after two tests seems to work?
      $zipfileobj = GeneralHelper::createFileObject($zipPath);
      file_unmanaged_delete($zipfileobj->getFileUri());
      file_unmanaged_delete_recursive($allfilespath);
      drupal_set_message($exception->getMessage(), "error");
    }
  }
  tmgmt_write_request_messages($job);
}

function tmgmt_contentapi_import(JobInterface $job,$filedatastring,$name){
  // Ensure we have the file uploaded.
  $message='';
  $path = $job->getSetting('scheme') . '://tmgmt_contentapi/LioxReceivedFiles/' . $name;
  $dirname = dirname($path);
  //file_prepare_directory($dirname, FILE_CREATE_DIRECTORY);
  if (file_prepare_directory($dirname, FILE_CREATE_DIRECTORY)) {
    $file = file_save_data($filedatastring, $path, FILE_EXISTS_REPLACE);
    $mimetype = $file->getMimeType();//\Drupal::service('file.mime_type.guesser')->guess($path);
    $filearray = null;
    if ($mimetype == 'application/zip') {
      $ziparchive = new ZipArchive();
      $openachresult = $ziparchive->open(\Drupal::service('file_system')->realpath($path));
      if ($openachresult) {
        $pathtoextract = $job->getSetting('scheme') . '://tmgmt_contentapi/LioxReceivedFiles/' . pathinfo($path)['filename'];
        if ($ziparchive->extractTo(\Drupal::service('file_system')->realpath($pathtoextract))) {
          $ziparchive->close();
          $file->delete();
          $filearray = CpcreateFileObjectFromStdClass(file_scan_directory($pathtoextract, '/.*\.xlf$/'));
        }

      }
    } else {
      $filearray = array($file);
    }
    foreach ($filearray as $fileitem){
      $extension = pathinfo($fileitem->getFileUri(), PATHINFO_EXTENSION);
      $plugin = new Xliff();
      if ($plugin) {
        // Validate the file on job.
        $validated_job = $plugin->validateImport($fileitem->getFileUri(), $job);
        if (!$validated_job) {
          \Drupal::logger('TMGMT_CONTENTAPI')->error('Failed to validate file %FILE for job %JOB, import aborted.', [
            '%JOB' => $job->label(),
            '%FILE' => $fileitem->getFileName(),
          ]);
          $job->addMessage('Failed to validate file, import aborted.', array(), 'error');
        } elseif ($validated_job->id() != $job->id()) {
          \Drupal::logger('TMGMT_CONTENTAPI')->notice('The imported file job id %file_id does not match the job id %job_id.', [
            '%file_id' => $validated_job->id(),
            '%job_id' => $job->id(),
          ]);
          $job->addMessage('The imported file job id @file_id does not match the job id @job_id.', array(
            '@file_id' => $validated_job->id(),
            '@job_id' => $job->id(),
          ), 'error');
        } else {
          try {
            // Validation successful, start import.
            // TODO: Check if it makes sense to check only the active state here?
            GeneralHelper::resetJobandItemsToActive($job,$file);
            $job->addTranslatedData($plugin->import($fileitem->getFileUri()));
            \Drupal::logger('TMGMT_CONTENTAPI')->notice('Successfully imported file %file_id for job %job_id.', [
              '%file_id' => $fileitem->getFileName(),
              '%job_id' => $job->label(),
            ]);
            $job->addMessage('File @filename imported successfully',array('@filename'=>$fileitem->getFileName()));
          } catch (Exception $e) {
            \Drupal::logger('TMGMT_CONTENTAPI')->error('File import for job %JOB failed with the following message: %message', [
              '%JOB' => $job->label(),
              '%message' => $e->getMessage(),
            ]);
            $job->addMessage('File import failed with the following message: @message', array('@message' => $e->getMessage()), 'error');

          }
        }
      }
    }
  }
}

function tmgmt_contentapi_downlaod_data_from_contentapi(TranslatorInterface $translator){
  try{
    $allJobs = GeneralHelper::getAllJobsByTranslator($translator);
    foreach ($allJobs as $job) {
      $task = $job->getSetting('capi-settings')['task'];
      if ($job->getState() == Job::STATE_ACTIVE && $task == 'trans') {
        tmgmt_contentapi_downlaod_data_from_contentapi_by_job($translator,$job);
      }
    }
  }
  catch (Exception $exception){
    \Drupal::logger('TMGMT_CONTENTAPI')->error('Could not check delivery list for provider %provider: %message', [
      '%provider'=> $translator->id(),
      '%message'=> $exception->getMessage(),
    ]);
    drupal_set_message('An error occured while fetching and importing files: '.$exception->getMessage(),'error');
  }
}

function tmgmt_contentapi_downlaod_data_from_contentapi_by_job(TranslatorInterface $translator,JobInterface $job){
  try{
    // $jobcpcettings is an array of arrays, which contain the requests then.
    $prId = GeneralHelper::getCpJobIdfromLocJob($job);
    $token = ConentApiHelper::generateToken($translator);
    $requestapi = new RequestApi();
    $requestsarray = $requestapi->jobsJobIdRequestsGet($token,$prId);
    $arrayfinishedrequests = array();
    foreach ($requestsarray as $temprequest){
      if($temprequest->getStatusCode()->getStatusCode() == StatusCodeEnum::REVIEW_TRANSLATION){
        $arrayfinishedrequests[] = $temprequest;
      }
    }
    // If no requests in state REVIEW_TRANSLATION, return with message.
    if(count($arrayfinishedrequests)<=0){
      drupal_set_message(t('no deliveries available for job:').$job->label());
      return;
    }
    // Set folder where files should be stored.
    $dir = $job->getSetting('scheme') . '://tmgmt_contentapi/LioxReceivedFiles/';
    //file_prepare_directory($dirname, FILE_CREATE_DIRECTORY);
    if (file_prepare_directory($dir, FILE_CREATE_DIRECTORY)) {
      $stmrg = \Drupal::service('stream_wrapper_manager')->getViaUri($job->getSetting('scheme') . '://tmgmt_contentapi/LioxReceivedFiles/');
      $tempfolder = $stmrg->realpath();
      $config = new Configuration();
      $config->setTempFolderPath($tempfolder);
      Configuration::setDefaultConfiguration($config);
      $requesttoapprove = array();
      foreach ($arrayfinishedrequests as $request){
        $fileapi = new FileApi();
        // array with file, code and httpheader.
        $spfilearray = $fileapi->jobsJobIdRequestsRequestIdRetrievefileGetWithHttpInfo($token,$prId,$request->getRequestId());
        $spfile = $spfilearray[0];
        $fcontent = $spfile->fread($spfile->getSize());
        $fpath = $spfile->getRealPath();
        $spfilearray[0] = NULL;
        $spfile = NULL;
        file_unmanaged_delete($fpath);
        $filename = str_replace('"','',explode("=",explode(";",$spfilearray[2]['Content-Disposition'][0])[1])[1]);
        tmgmt_contentapi_import($job,$fcontent,$filename);
        // Check if item is accepted, add request array to ack later.
        $requestSourceNativeId = explode("_",$request->getSourceNativeId())[1];
        if(isset($requestSourceNativeId)&& $requestSourceNativeId != "all") {
          $jobitem = array_values($job->getItems(['tjiid' => $requestSourceNativeId]))[0];
          if($jobitem && $jobitem->getState() == JobItem::STATE_ACCEPTED){
            $requesttoapprove[] = $request->getRequestId();
          }
        }
        // All items has been sent in one request
        else {
          if ($requestSourceNativeId == 'all'){
            $alljobitems = $job->getItems();
            $acceptedItems = $job->getItems(array('state'=>JobItem::STATE_ACCEPTED));
            if(count($alljobitems) == count($acceptedItems)){
              $requesttoapprove[] = $request->getRequestId();
            }
          }
        }
      }
      // Ack all requests and if job finished, archive job in contentAPI.
      if (count($requesttoapprove) >0){
        $arrayofrequestid = new ArrayOfRequestIds(array('request_ids'=>$requesttoapprove));
        $requestapi = new RequestApi();
        $requestapi->jobsJobIdRequestsApprovePut($token,$prId,$arrayofrequestid);
      }
      // not sure, if at this stage the local job has already been saved and status updated.
      // might be that the status still in progress, even import run successfully.
      // load refreshed job from DB.
      $job = Job::load($job->id());
      if($job->getState() == Job::STATE_FINISHED){
        $jobapi = new JobApi();
        $jobapi->jobsJobIdArchivePut($token,$prId);
      }
    }
    else{
      drupal_set_message(t('Directory could not be created: ') . $dir);
      return;
    }



  }
  catch (Exception $exception){
    $respbody = $exception->getMessage();
    if($exception instanceof \Drupal\tmgmt_contentapi\Swagger\Client\ApiException){
      $respbody = $exception->getResponseBody();
    }
    drupal_set_message('An error occured while fetching and importing files: '.$respbody,'error');
  }
}



/**
 * Implements hook_file_download().
 */
function tmgtm_contentapi_file_download($uri) {
  // Get the file record based on the URI. If not in the database just return.
  $fids = \Drupal::entityQuery('file')
    ->condition('uri', $uri)
    ->execute();
  if ($fids) {
    $files = \Drupal\file\Entity\File::loadMultiple($fids);
    foreach ($files as $item) {
      // Since some database servers sometimes use a case-insensitive comparison
      // by default, double check that the filename is an exact match.
      if ($item->getFileUri() === $uri) {
        $file = $item;
        break;
      }
    }
  }
  if (!isset($file)) {
    return;
  }

  // Check if this file belongs to a job.
  $usage_list = \Drupal::service('file.usage')->listUsage($file);
  if (!isset($usage_list['tmgmt_contentapi']['tmgmt_job'])) {
    return;
  }

  foreach (Job::loadMultiple(array_keys($usage_list['tmgmt_fwconnector']['tmgmt_job'])) as $job) {
    if ($job->access('view')) {
      // Access is granted.
      $headers = file_get_content_headers($file);
      return $headers;
    }
  }
  // Returning nothing means access denied unless another module specifically
  // grants access.
}


function tmgmt_contentapi_cron() {
  // Get all translators.
  $translators = \Drupal::entityManager()->getStorage('tmgmt_translator')->loadByProperties(['plugin' => 'contentapi']);

  if (!$translators) {
    return;
  }


  foreach ($translators as $translator) {
    // Receive all processed translations.
    //module_load_include('inc', 'tmgmt_fwconnector', 'tmgmt_fwconnector.cron');
    $config = $translator->getSetting('cron-settings');

    // Make sure cron is enabled for this translator.
    if (!$config['status']) {
      \Drupal::logger('TMGMT_CONTENTAPI')->notice('Cron disabled for translator %translator', [
        '%translator' => $translator->label(),
      ]);
      continue;
    }
    tmgmt_contentapi_downlaod_data_from_contentapi($translator);
  }
}


/**
 * Implements hook_tmgmt_job_delete().
 */
function tmgmt_contentapi_tmgmt_job_delete(JobInterface $job) {
  // If job has not been processed yet, we don't need to delete remote job.

  if($job->getState() == Job::STATE_UNPROCESSED){
    return;
  }
  $translator = $job->getTranslator();
  // Ignore jobs that don't have a file translator.
  if (!$translator || $translator->getPlugin()->getPluginId() != 'contentapi') {
    return;
  }

  try {
    $token = ConentApiHelper::generateToken($translator);
    $jobid = GeneralHelper::getCpJobIdfromLocJob($job);
    $jobapi = new JobApi();
    $jobapi->jobsJobIdDelete($token,$jobid);
    drupal_set_message(t("Content API Job deleted:") . $jobid);
  }
  catch (Exception $ex) {
    drupal_set_message(t('The job with ID @proj 
    could not be deleted in content api. It probably doesn\'t extist. 
    Please contact the responsible project manager in case of questions.', array('@proj' => $jobid)));
  }
  // Check if there are any files that need to be deleted.
  // @todo There doesn't seem to be an API function for this...
  $args = [
    ':module' => 'tmgmt_contentapi',
    ':type' => 'tmgmt_job',
    ':id' => $job->id(),
  ];
  $result = db_query('SELECT fid FROM {file_usage} WHERE module = :module and type = :type and id = :id', $args);
  $fids = $result->fetchCol();
  if (!empty($fids)) {
    // Remove file usage record.
    $file_usage = \Drupal::service('file.usage');
    foreach (File::loadMultiple($fids) as $file) {
      $file_usage->delete($file, 'tmgmt_contentapi', 'tmgmt_job', $job->id());
      // If this was the last usage, FileUsageBase marks the file as temporary
      // for delayed deletion. Because we know it is not needed, delete the file
      // immediately.
      $usage = $file_usage->listUsage($file);
      if (empty($usage)) {
        $file->delete();
      }
    }

  }

}

//first we set a header in tmgmt_fwconnector_views_pre_view and then modify the html content of the header in this hook
function tmgmt_contentapi_views_pre_render(\Drupal\views\ViewExecutable $view) {
  try {
    if ($view->id() == 'tmgmt_job_overview') {
      $view->header['area_deliveries_contentapi']->options['content'] .= CpprocessHtmlForJoboverview($view);
    }
  }
  catch (Exception $ex){
    drupal_set_message(t('Could not generate delivery list: ') . $ex->getMessage(),'warning');
  }
}


function tmgmt_contentapi_views_pre_view(Drupal\views\ViewExecutable $view) {

  if ($view->id() == 'tmgmt_job_overview') {
    $deliveryhtml = '';
    $options = array(
      'id' => 'area_deliveries_contentapi',
      'table' => 'views',
      'field' => 'area_text_custom',
      'relationship' => 'none',
      'group_type' => 'none',
      'admin_label' => '',
      'empty' => TRUE,
      'tokenize' => FALSE,
      'content' => $deliveryhtml,
      'plugin_id' => 'text_custom',
    );
    $view->setHandler($view->current_display, 'header', 'area_deliveries_contentapi', $options);
  }
}

function CpprocessHtmlForJoboverview(&$view){
  $activejobs = array();
  $result = $view->result;
  foreach ($result as $row) {
    $job = $row->_entity;
    if($job->hasTranslator()){
      $jobtranslator = $job->getTranslator();
      $trid = $jobtranslator->getPlugin()->getPluginId();
      $trname = $job->getTranslatorId();
      if($job->getState() == Job::STATE_ACTIVE && $trid == 'contentapi'){
        if(!isset($activejobs[$trname])) {
          $activejobs[$trname] = array($job);
        }
        else{
          $activejobs[$trname] = array_merge( $activejobs[$trname],array($job));
        }
      }
    }

  }

  $deliveryforjobs = array();
  If(count($activejobs)> 0) {
    foreach ($activejobs as $trid => $jobs) {
      // Array with translators.
      $translators = \Drupal::entityManager()->getStorage('tmgmt_translator')->loadByProperties(['name' => $trid]);
      $token = ConentApiHelper::generateToken($translators[$trid]);
      foreach ($jobs as $job){
        $requestapi = new RequestApi();
        $cpjobid = GeneralHelper::getCpJobIdfromLocJob($job);
        $cprequestsforjob = $requestapi->jobsJobIdRequestsGet($token,$cpjobid);
        $anyrequesttoreview = FALSE;
        foreach ($cprequestsforjob as $tempreq){
          if($tempreq->getStatusCode()->getStatusCode() == StatusCodeEnum::REVIEW_TRANSLATION){
            $anyrequesttoreview = TRUE;
            break;
          }
        }
        if($anyrequesttoreview){
          $deliveryforjobs = array_merge($deliveryforjobs,array($job));
        }
      }

    }
  }
  $deliveryhtml = '';
  if(count($deliveryforjobs)>0) {
    $deliveryhtml = '<details data-drupal-selector="edit-deliveries-wrapper" style="background: #3cff75" id="edit-deliveries-wrapper" class="js-form-wrapper form-wrapper">    
	<summary role="button" aria-controls="edit-deliveries-wrapper" aria-expanded="true" aria-pressed="true">
		CONTENT API DELIVERIES
	</summary>
	<div class="details-wrapper">';
    foreach ($deliveryforjobs as $job) {
      $jobid = $job->get('tjid')->getValue()[0];
      global $base_url;
      // Using Id here, as job label returns @title@title and @more more.
      $joblable = GeneralHelper::getJobLabel($job);
      $pass_link = \Drupal::l(t($joblable), \Drupal\Core\Url::fromUri($base_url . '/admin/tmgmt/jobs/' . $jobid['value']));
      $currentlink = $pass_link->getGeneratedLink();

      $deliveryhtml .= '<li>'.$currentlink .'</li>';
      // In drupal_set_message
    }
    $deliveryhtml .= '</div></details>';
  }
  return $deliveryhtml;
}

function CpcreateFileObjectFromStdClass($filearray){
  $filsystem = \Drupal::service('file_system');
  $toreturn = array();
  foreach ($filearray as $fl) {
    $file = File::create([
      'uid' => \Drupal::currentUser()->id(),
      'filename' => $filsystem->basename($fl->filename),
      'uri' => $fl->uri,
      'filemime' => \Drupal::service('file.mime_type.guesser')->guess($fl->uri),
      'filesize' => filesize($fl->uri),
      'status' => 1
    ]);
    $file->save();
    array_push($toreturn,$file);
  }
  return $toreturn;
}

function tmgmt_contentapi_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id){
  if($form_id == 'tmgmt_job_item_edit_form') {
    $item = $form_state->getFormObject()->getEntity();
    $translator = $item->getJob()->getTranslator()->getPlugin()->getPluginId();
    if(isset($translator) && $translator == 'contentapi') {
      /**
      $form['actions']['reject'] = [
      '#type' => 'submit',
      '#value' => t('Reject Translation'),
      '#access' => !$form_state->get('all_preliminary'),
      '#submit' => ['::submitForm', '::save'],
      ];
       * */
      if($item->getJob()->getState() != Job::STATE_UNPROCESSED) {
        if (isset($form['actions']['abort_job_item'])) {
          unset($form['actions']['abort_job_item']);
        }
        if (isset($form['actions']['delete'])) {
          unset($form['actions']['delete']);
        }
      }
    }
  }
  if ($form_id == 'tmgmt_job_edit_form'){
    try {
      $job = $form_state->getFormObject()->getEntity();
      $translator = $job->getTranslator();
      $translatorid = $translator->getPluginId();
      if (isset($translator) && $translatorid == 'contentapi') {
        if ($job->getState() == Job::STATE_ACTIVE) {
          // remove abort button
          if (isset($form['actions']['abort_job'])) {
            unset($form['actions']['abort_job']);
          }
          $jobapi = new JobApi();
          $remotejob = $jobapi->jobsJobIdGet(ConentApiHelper::generateToken($translator), GeneralHelper::getCpJobIdfromLocJob($job));
          $remotestatus = $remotejob->getStatusCode()->getStatusCode();
          if ($remotestatus != StatusCodeEnum::COMPLETED && $remotestatus != StatusCodeEnum::CANCELLED && $remotestatus != StatusCodeEnum::TRANSLATION_REJECTED) {
            //remove delete button
            if (isset($form['actions']['delete'])) {
              unset($form['actions']['delete']);
            }
          }
        }
      }
    }
    catch (Exception $exception){
      $job->addMessage(t('an error occured while updating job\'s operations and state: ' . $exception->getMessage()));
    }
  }

}

/**
 * Comment.
 *
 * @param array $form
 *   Comment.
 * @param FormStateInterface $form_state
 *   Comment.
 *
 * @return mixed
 *   Comment.
 */
function ajax_tmgmt_contentapi_provider_changed(array $form, &$form_state) {
  return $form['translator_wrapper']['settings']['capi-settings']['quote'];

}


function tmgmt_contentapi_form_tmgmt_job_edit_form_alter(&$form, FormStateInterface &$form_state) {
  setValidator($form, $form_state);
}

function tmgmt_contentapi_job_form_validate(&$form, &$form_state){
  canTranslateByProvider($form, $form_state);
}


function canTranslateByProvider(&$form, FormStateInterface &$form_state){
  $job = $form_state->getFormObject()->buildEntity($form, $form_state);
  if($job->hasTranslator()) {
    $translator = $job->getTranslator();
    if ($translator->getPluginId() == 'contentapi') {
      $plugin = $translator->getPlugin();
      if (!canCustomTranslate($translator, $job, $plugin)) {
        //drupal_set_message(t('@translator can not translate from @source to @target.', array('@translator' => $translator->label(), '@source' => $job->getSourceLanguage()->getName(), '@target' => $job->getTargetLanguage()->getName())), 'error');
        $form_state->setError($form['translator_wrapper']['translator'],
          t('@translator can not translate from @source to @target.', [
            '@translator' => $translator->label(),
            '@source' => $job->getSourceLanguage()->getName(),
            '@target' => $job->getTargetLanguage()->getName()
          ]));
      }

    }
  }

}

function setValidator(&$form, FormStateInterface &$form_state){
  if(!isset($form['#validate']['tmgmt_contentapi_job_form_validate'])) {
    $form['#validate'][] = 'tmgmt_contentapi_job_form_validate';
  }
}

function canCustomTranslate(TranslatorInterface $translator, JobInterface $job, \Drupal\tmgmt\TranslatorPluginInterface $plugin) {
  $token = ConentApiHelper::generateToken($translator);
  $langmappingsremote = $translator->getRemoteLanguagesMappings();
  $capisettings = $translator->getSetting('capi-settings');
  $defaultproviderkey = $capisettings['provider'];
  $providerId = isset($job->getSetting('capi-settings')['provider']) ? $job->getSetting('capi-settings')['provider'] : $defaultproviderkey;
  $provider = getProvider($token, $providerId);
  $capabilities = isset($provider) ? $provider->getCapabilities() : NULL;
  if(isset($capabilities)) {
    $provider_supported_langs = $capabilities->getSupportedLanguages();
    $supports_lang = FALSE;
    if (!isset($provider_supported_langs)) {
      return TRUE;
    }
    else {
      foreach ($provider_supported_langs as $lang_pair) {
        $job_remote_source_lang = $langmappingsremote[$job->getSourceLangcode()];
        $job_remote_target_lang = $langmappingsremote[$job->getTargetLangcode()];
        if (in_array($job_remote_source_lang, $lang_pair->getSources()) &&
          in_array($job_remote_target_lang, $lang_pair->getTargets())) {
          $supports_lang = TRUE;
        }
      }
      if ($supports_lang) {
        return TRUE;
      }
      else {
        return FALSE;
      }
    }
  }
  else {
    return TRUE;
  }
}


function tmgmt_contentapi_check_empty_file($form,&$form_state){
  $all_files = \Drupal::request()->files->get('files', []);
  // Make sure there's an upload to process.
  if (empty($all_files['file'])) {
    $form_state->setErrorByName('file',t('No files selected, action cannot be completed.'));
  }
}

function tmgmt_contentapi_entity_operation_alter(array &$operations,\Drupal\Core\Entity\EntityInterface  $entity) {

  try {
    // instance of tmgmt_job
    if ($entity instanceof Job) {
      // get local state of the job
      $localjobstate = $entity->getState();
      if ($localjobstate == Job::STATE_ACTIVE) {
        $jobtranslator = $entity->getTranslator();
        $jobtranslatorId = $jobtranslator->getPluginId();
        // modify operations only for contentapi translator
        if ($jobtranslatorId == 'contentapi') {
          // TODO: check remote job's state, if canceled, do not remove delete operation
          if (isset($operations['abort'])) {
            unset($operations['abort']);
          }
          $jobapi = new JobApi();
          $remotejob = $jobapi->jobsJobIdGet(ConentApiHelper::generateToken($jobtranslator), GeneralHelper::getCpJobIdfromLocJob($entity));
          $remotestatus = $remotejob->getStatusCode()->getStatusCode();
          if($remotestatus != StatusCodeEnum::COMPLETED && $remotestatus != StatusCodeEnum::CANCELLED && $remotestatus != StatusCodeEnum::TRANSLATION_REJECTED) {
            if (isset($operations['delete'])) {
              unset($operations['delete']);
            }
          }
        }
      }
    }
    if($entity instanceof JobItem){
      $job = $entity->getJob();
      $localjobstate = $job->getState();
      if ($localjobstate != Job::STATE_UNPROCESSED) {
        $jobtranslator = $job->getTranslator();
        $jobtranslatorId = $jobtranslator->getPluginId();
        // modify operations only for contentapi translator
        if ($jobtranslatorId == 'contentapi') {
          if (isset($operations['abort'])) {
            unset($operations['abort']);
          }
          if (isset($operations['delete'])) {
            unset($operations['delete']);
          }
        }
      }
    }
  }
  catch (Exception $exception){
    $entity->addMessage(t('an error occured while updating job\'s operations and state: ' . $exception->getMessage()));
  }
}

function getProviders($token){
  $providers = NULL;
  if(isset($token) && $token != '') {
    try {
      $providerapi = new ProviderApi();
      $providers = $providerapi->providersGet($token);
    } catch (Exception $e) {
      drupal_set_message($e->getMessage());
    }
  }
  $providersarray = array();
  foreach ($providers as $provider) {
    $prid = $provider->getProviderId();
    $prname = $provider->getProviderName();
    $providersarray[$prid] = $prname;
  }
  asort($providersarray, SORT_REGULAR);
  return $providersarray;
}


function getProvider($token, $providerId){
  $provider = NULL;
  if(isset($token) && $token != '') {
    try {
      $providerapi = new ProviderApi();
      $provider = $providerapi->providersProviderIdGet($token, $providerId);
    } catch (Exception $e) {
      drupal_set_message($e->getMessage());
    }
  }

  return $provider;
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc