cloudwords-8.x-1.x-dev/cloudwords.cron.inc

cloudwords.cron.inc
<?php

/**
 * @file
 * Cron for cloudwords.module.
 */

function _cloudwords_cron(){
  _cloudwords_cron_release_closed_project_content();
  //@todo fix automatic import and auto project creation
  _cloudwords_cron_auto_import_translation_preview_bundle();
//  _cloudwords_cron_auto_project_creation_of_out_of_date_translatables();
}

function _cloudwords_cron_auto_import_translation_preview_bundle(){
  // @todo clear cache for cloudwords translatables

  $enabled = \Drupal::config('cloudwords.settings')->get('cloudwords_auto_import_translation_enabled');
  if($enabled != true){
    return false;
  }
  $cloudwords_auto_import_translation_max_process_items = \Drupal::config('cloudwords.settings')->get('cloudwords_auto_import_translation_max_process_items');
  $cloudwords_auto_import_translation_frequency = \Drupal::config('cloudwords.settings')->get('cloudwords_auto_import_translation_frequency');
  $cloudwords_auto_import_translation_frequency = (is_int($cloudwords_auto_import_translation_frequency)) ? $cloudwords_auto_import_translation_frequency : 0;
  $frequency_setting = $cloudwords_auto_import_translation_frequency  * 60;


  $cloudwords_auto_import_translation_last_cron_run = \Drupal::state()->get('cloudwords_auto_import_translation_last_cron_run');
  $cloudwords_auto_import_translation_last_cron_run = (is_int($cloudwords_auto_import_translation_last_cron_run)) ? $cloudwords_auto_import_translation_last_cron_run : REQUEST_TIME;
  $runnable_after = $cloudwords_auto_import_translation_last_cron_run + $frequency_setting;
  if($runnable_after && ($runnable_after > REQUEST_TIME)){
    return false;
  }

  module_load_include('inc', 'cloudwords', 'cloudwords.pages');

  $projects = cloudwords_get_api_client()->get_open_projects();

 //$existing_ids = \Drupal::database()->query("SELECT pid FROM {cloudwords_project} WHERE status NOT IN (:cancelled)", [':cancelled' => cloudwords_project_closed_statuses()])->fetchCol();
  $query = \Drupal::entityTypeManager()->getStorage('cloudwords_project')->getQuery();
  $query->condition('status', cloudwords_project_closed_statuses(), 'NOT IN');
  $existing_ids = $query->execute();

//  $importables = [];
  $imported = 0;
  foreach ($projects as $project) {
    if (in_array($project->getId(), $existing_ids)) {
      $params = $project->getParams();
      foreach ($params['targetLanguages'] as $delta => $lang) {
        $language = new \Drupal\cloudwords\CloudwordsLanguage($lang);
        $translated_bundles = [];
        try {
          $translated_bundles = cloudwords_get_api_client()->get_translated_bundles($project->getId(), $language->getLanguageCode());
        } catch (CloudwordsApiException $e) {}

        if($translated_bundles){
          $valid_ctids = $project->getCtids(cloudwords_map_cloudwords_drupal($language->getLanguageCode()));
          $translatables = cloudwords_translatable_load_multiple($valid_ctids);

          foreach($translatables as $translatable){
            foreach($translated_bundles as $translated_bundle){
              // \Drupal::logger('cloudwords')->notice('translatable %tid , project %pid , bundle_id %bid', ['%tid' => $translatable->getId(), '%pid' => $project->getId(), '%bid' => $translated_bundle['id']]);
              if(is_null($translatable->getLastImport()) ||
                (!is_null($translatable->getLastImport()) && $translatable->getLastImport() < strtotime($translated_bundle['xliff']['createdDate']))){
                // TODO implement queue if max_process items is a large number
                if($imported <= $cloudwords_auto_import_translation_max_process_items) {
                  _cloudwords_cron_auto_import_translation_preview_bundle_cron_import_xliff($project, $language, $translatable, $translated_bundle);
                  $imported++;
                }
              }
            }
          }
        }
      }
    }
  }
  \Drupal::state()->set('cloudwords_auto_import_translation_last_cron_run', REQUEST_TIME);
}

/*
 *  Imports single document to a translatable at a time.
 */
function _cloudwords_cron_auto_import_translation_preview_bundle_cron_import_xliff($project, $language, $translatable, $translated_bundle){
  $file = cloudwords_get_api_client()->get_translated_document_by_id($project->getId(), $language->getLanguageCode(), $translated_bundle['id']);

  $temp_dir = \Drupal::service('file_system')->realpath(cloudwords_temp_directory());
  $temp = \Drupal::service('file_system')->tempnam($temp_dir, 'cloudwords-');
  file_put_contents($temp, $file);

  module_load_include('inc', 'cloudwords', 'includes/cloudwords.serializer');
  $serializer = new \CloudwordsFileformatXLIFF();

  if (simplexml_load_string(_cloudwords_filter_xml_control_characters(file_get_contents($temp))) &&
  $serializer->validateImport($project, $language, $temp)) {
    $imported = $serializer->import($temp);

    foreach ($imported as $ctid => $data) {
      try {
        //$translatable->setSetting('node_status', (int) isset($node_statuses[$ctid]));
        $translatable->saveData($data);
        $translatable->translation_status = CLOUDWORDS_TRANSLATION_STATUS_TRANSLATION_EXISTS;
        $translatable->translated_document_id = $translated_bundle['id'];
        $translatable->last_import = time();
        $translatable->save();
        $translatable->setProjectTranslationStatus($project, CLOUDWORDS_LANGUAGE_IMPORTED);
        if(\Drupal::config('cloudwords.settings')->get('cloudwords_preview_bundle_enabled') != FALSE && $translatable->getType() == 'node') {
          $translation_preview_bundle = new \Drupal\cloudwords\CloudwordsTranslationPreviewBundle($project, $translatable, $translated_bundle);
          $translation_preview_bundle->import();
        }
      }
      catch (Exception $e) {
        drupal_set_message(t($e->getMessage()), 'error');
        $translatable->setProjectTranslationStatus($project, CLOUDWORDS_LANGUAGE_FAILED);
      }
    }
  }
}


function _cloudwords_cron_auto_project_creation_of_out_of_date_translatables(){
  module_load_include('inc', 'cloudwords', 'cloudwords.create_project');
  //auto create projects of grouped content for out of date translatables if enabled

  $auto_project_creation_enabled = \Drupal::config('cloudwords.settings')->get('cloudwords_auto_project_creation_enabled');
  if($auto_project_creation_enabled != true){
    return false;
  }

  // Get list of translatables that are flagged as out of date and are NOT currently in a project
  $properties = ['translation_status' => 2, 'status' => 0];
  $translatables = cloudwords_get_translatables_by_property($properties);

  //this must be run as a particular user to simulate the UI addition of ctids to a project
  $user = \Drupal::currentUser();
  $original_user = $user;
  $old_state = drupal_save_session();
  drupal_save_session(FALSE);
  $user = \Drupal::entityTypeManager()->getStorage('user')->load(1);

  // group by language
  $langCtids = [];
  foreach($translatables as $translatable){
    $langCtids[$translatable->language][] = $translatable->ctid;
  }

  foreach($langCtids as $langCode => $ctids){
    $form_state = [];
    $form_state['values']['project_name'] = t('auto_!langCode_!date',
      ['!langCode' => $langCode,
            '!date' => date('Y_m_d_H_i_s',time()
            )
           ]
      );

    $form_state['in_cron'] = true;
    $form_state['ctids'] = $ctids;
    $form_state['values']['op'] = 'Submit';
    $form_state['values']['submit'] = 'Submit';

    \Drupal::formBuilder()->submitForm('cloudwords_project_create_form', $form_state);
  }

  $user = $original_user;
  drupal_save_session($old_state);
}

function _cloudwords_cron_release_closed_project_content(){
  $last = REQUEST_TIME - \Drupal::config('cloudwords.settings')->get('cloudwords_last_cron_run');

  $last = $last / 3600;

  if ($last && $last < 24) {
    return;
  }

  $projects = cloudwords_get_api_client()->get_open_projects();

  $query = \Drupal::entityTypeManager()->getStorage('cloudwords_project')->getQuery();
  $query->condition('status', cloudwords_project_closed_statuses(), 'NOT IN');
  $existing_ids = $query->execute();

  foreach ($projects as $project) {
    if (in_array($project->getId(), $existing_ids)) {
      $project_info = [
        'name' => $project->getName(),
        'status' => $project->getStatus()->getCode(),
      ];
      \Drupal::database()->merge('cloudwords_project')->fields($project_info)->key(['id' => $project->getId()])->execute();
      foreach ($project->getTargetLanguages() as $language) {
        try {
          $files = cloudwords_get_api_client()->get_project_translated_files($project->getId());
          // Approve languages that were not previously approved.
          foreach ($files as $file) {
            if ($file->getStatus()->getCode() == 'approved' &&
                $project->getLanguageImportStatus($language) != CLOUDWORDS_LANGUAGE_APPROVED) {
              $project->approve($language);
            }
          }
        }
        catch (CloudwordsApiException $e) {}
      }
    }
  }

  // release the content for closed projects
  $closed_projects = [];
  try {
    $closed_projects = cloudwords_get_api_client()->get_closed_projects();
  }
  catch (CloudwordsApiException $e) {}

  if ($closed_projects && $existing_ids) {
    foreach ($closed_projects as $project) {
      if (in_array($project->getId(), $existing_ids)) {
        $project->releaseContent();
        $project->setStatus($project->getStatus()->getCode());
      }
    }
  }
  \Drupal::configFactory()->getEditable('cloudwords.settings')->set('cloudwords_last_cron_run', REQUEST_TIME)->save();
}

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

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