diff --git a/.gitignore b/.gitignore
index 61964d6de0..8bbdef9933 100644
--- a/.gitignore
+++ b/.gitignore
@@ -122,3 +122,4 @@ software/css
speaker_bureau/css
registration/css
/summit-trackchair-app/css/
+/.env
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 0000000000..08a9a3768c
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+12.22.12
\ No newline at end of file
diff --git a/ICLA/code/migrations/UpdateGerritUsersMigration.php b/ICLA/code/migrations/UpdateGerritUsersMigration.php
index 9e6973a51c..dea2652227 100644
--- a/ICLA/code/migrations/UpdateGerritUsersMigration.php
+++ b/ICLA/code/migrations/UpdateGerritUsersMigration.php
@@ -1,6 +1,6 @@
'FoundationMemberID',
- 'FoundationMember.Name' => 'Member name',
- 'FoundationMember.Email' => 'Member email',
- 'FoundationMember.SecondEmail' => 'Member email (2)',
- 'FoundationMember.ThirdEmail' => 'Member email (3)',
- 'Identifier' => 'Identifier',
- 'Expires' => 'Expires'
- ];
- }
-
- public function getList() {
- $list = AUCMetric::get()
- ->sort([
- 'Identifier ASC',
- 'Expires ASC'
- ]);
- $params = $this->request->requestVar('q');
-
- if(!empty($params['MemberSearch'])) {
- $s = Convert::raw2sql($params['MemberSearch']);
- $list = $list
- ->innerJoin('Member','FoundationMemberID = Member.ID')
- ->where("
- Member.Email LIKE '%{$s}%'
- OR Member.SecondEmail LIKE '%{$s}%'
- OR Member.ThirdEmail LIKE '%{$s}%'
- OR (CONCAT_WS(' ', Member.FirstName, Member.Surname)) LIKE '%{$s}%'
- ");
- }
-
- if(!empty($params['Metric'])) {
- $list = $list->filter('Identifier', $params['Metric']);
- }
-
- return $list;
- }
-
-}
\ No newline at end of file
diff --git a/auc-metrics/code/admins/SangriaAUCExtension.php b/auc-metrics/code/admins/SangriaAUCExtension.php
deleted file mode 100644
index 9c14a8e2d5..0000000000
--- a/auc-metrics/code/admins/SangriaAUCExtension.php
+++ /dev/null
@@ -1,53 +0,0 @@
-update(get_class($this), 'allowed_actions', self::$allowed_actions);
- Config::inst()->update(get_class($this->owner), 'allowed_actions', self::$allowed_actions);
- }
-
- public function AUCFixMissMatchConflicts(SS_HTTPRequest $request)
- {
- Requirements::css("sangria/ui/source/css/sangria.css");
- return $this->owner->Customise
- (
- ['OpenStackResourceApiBaseUrl' => OPENSTACK_RESOURCE_API_BASE_URL]
- )->renderWith(array('SangriaPage_AUCFixMissMatchConflicts', 'SangriaPage', 'SangriaPage'));
- }
-
- public function AUCMetricsList(SS_HTTPRequest $request){
-
- Requirements::css("sangria/ui/source/css/sangria.css");
- Requirements::css('node_modules/jquery-datetimepicker/build/jquery.datetimepicker.min.css');
-
- Requirements::javascript('node_modules/php-date-formatter/js/php-date-formatter.min.js');
- Requirements::javascript('node_modules/jquery-datetimepicker/build/jquery.datetimepicker.full.min.js');
-
- return $this->owner->Customise
- (
- []
- )->renderWith(array('SangriaPage_AUCMetricsList', 'SangriaPage', 'SangriaPage'));
- }
-}
\ No newline at end of file
diff --git a/auc-metrics/code/api/SangriaAucMetricsRestfullApi.php b/auc-metrics/code/api/SangriaAucMetricsRestfullApi.php
deleted file mode 100644
index 002a4860a8..0000000000
--- a/auc-metrics/code/api/SangriaAucMetricsRestfullApi.php
+++ /dev/null
@@ -1,171 +0,0 @@
-repository = $repository;
- }
-
- /**
- * @return bool
- */
- public function authorize(){
- //check permissions
- if(!Permission::check("SANGRIA_ACCESS"))
- return false;
- return true;
- }
-
- static $url_handlers = [
- ' user-miss-matches' => 'handleUserMissMatches',
- 'GET ' => 'getMetrics',
- 'GET csv' => 'exportMetricToCSV',
- ];
-
- static $allowed_actions = [
- 'handleUserMissMatches',
- 'getMetrics',
- 'exportMetricToCSV',
- ];
-
- /**
- * @param SS_HTTPRequest $request
- * @return mixed|SS_HTTPResponse
- */
- function handleUserMissMatches(SS_HTTPRequest $request){
- $api = SangriaAucMetricsUserMissMatchesRestfullApi::create();
- return $api->handleRequest($request, DataModel::inst());
- }
-
- /**
- * @param SS_HTTPRequest $request
- * @return SS_HTTPResponse
- */
- function getMetrics(SS_HTTPRequest $request){
- try
- {
- $query_string = $request->getVars();
- $page = intval((isset($query_string['page'])) ? Convert::raw2sql($query_string['page']) : 0);
- $page_size = intval((isset($query_string['page_size'])) ? Convert::raw2sql($query_string['page_size']) : 25);
-
- // zero mean showing all ...
- if($page_size == 0) $page_size = PHP_INT_MAX;
-
- $order = (isset($query_string['order'])) ? Convert::raw2sql($query_string['order']) : '';
- $filter = (isset($query_string['filter'])) ? Convert::raw2sql($query_string['filter']) : '';
- $search_term = (isset($query_string['search_term'])) ? Convert::raw2sql($query_string['search_term']) : '';
- $type = (isset($query_string['type'])) ? Convert::raw2sql($query_string['type']) : '';
-
- list($list, $count) = $this->repository->getAllByPage
- (
- $page,
- $page_size,
- $order,
- $search_term,
- $type,
- $filter
- );
-
- $items = [];
- foreach ($list as $item){
- $expires_epoch = new DateTime($item->Expires);
- $created_epoch = new DateTime($item->Created);
- $items[] =
- [
- 'id' => intval($item->ID),
- 'identifier' => $item->Identifier,
- 'value' => $item->Value,
- 'value_description' => $item->ValueDescription,
- 'created' => $created_epoch->format("Y-m-d h:i:s A"),
- 'expires' => $expires_epoch->format("Y-m-d h:i:s A"),
- 'member_id' => intval($item->FoundationMember()->ID),
- 'member_full_name' => $item->FoundationMember()->FullName,
- 'member_email' => $item->FoundationMember()->Email,
- ];
- }
-
- return $this->ok(array('items' => $items, 'count' => $count));
- }
- catch(NotFoundEntityException $ex2)
- {
- SS_Log::log($ex2->getMessage(), SS_Log::WARN);
- return $this->notFound($ex2->getMessage());
- }
- catch(Exception $ex)
- {
- SS_Log::log($ex->getMessage(), SS_Log::ERR);
- return $this->serverError();
- }
- }
-
- /**
- * @param SS_HTTPRequest $request
- */
- function exportMetricToCSV(SS_HTTPRequest $request){
-
- $query_string = $request->getVars();
- $order = (isset($query_string['order'])) ? Convert::raw2sql($query_string['order']) : '';
- $search_term = (isset($query_string['search_term'])) ? Convert::raw2sql($query_string['search_term']) : '';
- $type = (isset($query_string['type'])) ? Convert::raw2sql($query_string['type']) : '';
- $filter = (isset($query_string['filter'])) ? Convert::raw2sql($query_string['filter']) : '';
-
- list($list, $count) = $this->repository->getAllByPage
- (
- 1,
- PHP_INT_MAX,
- $order,
- $search_term,
- $type,
- $filter
- );
-
- $filename = "AUCMetrics" . date('Ymd') . ".csv";
-
- $items = [];
- foreach ($list as $item){
- $expires_epoch = new DateTime($item->Expires);
- $created_epoch = new DateTime($item->Created);
- $items[] =
- [
- 'id' => intval($item->ID),
- 'identifier' => $item->Identifier,
- 'value' => $item->Value,
- 'value_description' => $item->ValueDescription,
- 'created' => $created_epoch->format("Y-m-d h:i:s A"),
- 'expires' => $expires_epoch->format("Y-m-d h:i:s A"),
- 'member_id' => intval($item->FoundationMember()->ID),
- 'member_full_name' => $item->FoundationMember()->FullName,
- 'member_email' => $item->FoundationMember()->Email,
- ];
- }
-
- return CSVExporter::getInstance()->export($filename, $items, ',');
- }
-}
\ No newline at end of file
diff --git a/auc-metrics/code/api/SangriaAucMetricsUserMissMatchesRestfullApi.php b/auc-metrics/code/api/SangriaAucMetricsUserMissMatchesRestfullApi.php
deleted file mode 100644
index 24afbc51ee..0000000000
--- a/auc-metrics/code/api/SangriaAucMetricsUserMissMatchesRestfullApi.php
+++ /dev/null
@@ -1,152 +0,0 @@
-repository = $repository;
- $this->service = $service;
- }
-
- static $url_handlers = [
- 'PUT $MISSMATCH_ID!' => 'resolveUserMissMatch',
- 'DELETE $MISSMATCH_ID!' => 'deleteUserMissMatch',
- 'GET ' => 'getUserUserMissMatches',
- ];
-
- static $allowed_actions = [
- 'resolveUserMissMatch',
- 'deleteUserMissMatch',
- 'getUserUserMissMatches'
- ];
-
- public function resolveUserMissMatch(SS_HTTPRequest $request){
- try {
- if(!$this->isJson()) return $this->validationError(array('invalid content type!'));
- $error_id = intval($request->param('MISSMATCH_ID'));
- $data = $this->getJsonRequest();
-
- $this->service->fixMissMatchUserError($error_id, intval($data['member_id']));
- return $this->updated();
- }
- catch(NotFoundEntityException $ex2)
- {
- SS_Log::log($ex2->getMessage(), SS_Log::WARN);
- return $this->notFound($ex2->getMessage());
- }
- catch(Exception $ex)
- {
- SS_Log::log($ex->getMessage(), SS_Log::ERR);
- return $this->serverError();
- }
- }
-
- public function deleteUserMissMatch(SS_HTTPRequest $request){
- try {
- $error_id = intval($request->param('MISSMATCH_ID'));
- $this->service->deleteMissMatchUserError($error_id);
- return $this->deleted();
- }
- catch(NotFoundEntityException $ex2)
- {
- SS_Log::log($ex2->getMessage(), SS_Log::WARN);
- return $this->notFound($ex2->getMessage());
- }
- catch(Exception $ex)
- {
- SS_Log::log($ex->getMessage(), SS_Log::ERR);
- return $this->serverError();
- }
- }
-
- public function getUserUserMissMatches(SS_HTTPRequest $request){
- try
- {
- $query_string = $request->getVars();
- $page = intval((isset($query_string['page'])) ? Convert::raw2sql($query_string['page']) : 0);
- $page_size = intval((isset($query_string['page_size'])) ? Convert::raw2sql($query_string['page_size']) : 25);
-
- // zero mean showing all ...
- if($page_size == 0) $page_size = PHP_INT_MAX;
-
- $order = (isset($query_string['order'])) ? Convert::raw2sql($query_string['order']) : '';
- $search_term = (isset($query_string['search_term'])) ? Convert::raw2sql($query_string['search_term']) : '';
- $type = (isset($query_string['type'])) ? Convert::raw2sql($query_string['type']) : '';
-
- list($list, $count) = $this->repository->getAllByPage(
- $page,
- $page_size,
- $order,
- $search_term,
- $type
- );
-
- $items = [];
- foreach ($list as $item){
- $items[] =
- [
- 'id' => intval($item->ID),
- 'service_identifier' => $item->ServiceIdentifier,
- 'user_identifier' => $item->UserIdentifier
- ];
- }
-
- return $this->ok(array('items' => $items, 'count' => $count));
- }
- catch(NotFoundEntityException $ex2)
- {
- SS_Log::log($ex2->getMessage(), SS_Log::WARN);
- return $this->notFound($ex2->getMessage());
- }
- catch(Exception $ex)
- {
- SS_Log::log($ex->getMessage(), SS_Log::ERR);
- return $this->serverError();
- }
- }
-}
\ No newline at end of file
diff --git a/auc-metrics/code/extensions/AUCMetricMember.php b/auc-metrics/code/extensions/AUCMetricMember.php
deleted file mode 100644
index 164261a22e..0000000000
--- a/auc-metrics/code/extensions/AUCMetricMember.php
+++ /dev/null
@@ -1,33 +0,0 @@
- 'Varchar'
- ];
-
- /**
- * @var array
- */
- private static $has_many = [
- 'AUCMetrics' => 'AUCMetric'
- ];
-
- /**
- * @param $identifier
- * @return mixed
- */
- public function hasAUCMetric($identifier)
- {
- return $this->owner->AUCMetrics()->filter([
- 'Identifier' => $identifier
- ])->exists();
- }
-}
\ No newline at end of file
diff --git a/auc-metrics/code/extensions/SangriaAUCRouterApiExtension.php b/auc-metrics/code/extensions/SangriaAUCRouterApiExtension.php
deleted file mode 100644
index 56c0296fc6..0000000000
--- a/auc-metrics/code/extensions/SangriaAUCRouterApiExtension.php
+++ /dev/null
@@ -1,39 +0,0 @@
-handleRequest($request, DataModel::inst());
- }
- }
-}
\ No newline at end of file
diff --git a/auc-metrics/code/infrastructure/repositories/SapphireAUCMetricMissMatchErrorRepository.php b/auc-metrics/code/infrastructure/repositories/SapphireAUCMetricMissMatchErrorRepository.php
deleted file mode 100644
index cbe9b25f9f..0000000000
--- a/auc-metrics/code/infrastructure/repositories/SapphireAUCMetricMissMatchErrorRepository.php
+++ /dev/null
@@ -1,93 +0,0 @@
-numRecords();
-
- $query .= <<push(new ArrayData($row));
- }
-
- return [$list, $count];
- }
-}
\ No newline at end of file
diff --git a/auc-metrics/code/infrastructure/repositories/SapphireAUCMetricRepository.php b/auc-metrics/code/infrastructure/repositories/SapphireAUCMetricRepository.php
deleted file mode 100644
index 7cdf07117a..0000000000
--- a/auc-metrics/code/infrastructure/repositories/SapphireAUCMetricRepository.php
+++ /dev/null
@@ -1,126 +0,0 @@
-numRecords();
-
- $query .= <<push(new AUCMetric($row));
- }
-
- return [$list, $count];
- }
-}
\ No newline at end of file
diff --git a/auc-metrics/code/interfaces/MetricService.php b/auc-metrics/code/interfaces/MetricService.php
deleted file mode 100644
index 08788db2ea..0000000000
--- a/auc-metrics/code/interfaces/MetricService.php
+++ /dev/null
@@ -1,37 +0,0 @@
-member = $member;
- $this->value = $value;
-
- parent::__construct();
- }
-
- /**
- * @return Member
- */
- public function getMember()
- {
- return $this->member;
- }
-
- /**
- * @return null
- */
- public function getValue()
- {
- return $this->value;
- }
-
-}
\ No newline at end of file
diff --git a/auc-metrics/code/misc/ResultList.php b/auc-metrics/code/misc/ResultList.php
deleted file mode 100644
index 9f1c9c72e4..0000000000
--- a/auc-metrics/code/misc/ResultList.php
+++ /dev/null
@@ -1,71 +0,0 @@
-getMember()->ID;
- }, $this->toArray());
-
- return $ids;
- }
-
- /**
- * @return bool|\DataList
- */
- public function getMemberList()
- {
- $ids = $this->getMemberIDs();
-
- if (count($ids)) {
- return Member::get()->byIDs($this->getMemberIDs());
- }
-
- return false;
- }
-
-
- /**
- * @param Member $member
- * @return bool
- */
- public function getValueForMember(Member $member)
- {
- foreach ($this as $item) {
- if ($item->getMember()->ID == $member->ID) {
- return $item->getValue();
- }
- }
-
- return false;
- }
-
-
-}
\ No newline at end of file
diff --git a/auc-metrics/code/models/AUCMetric.php b/auc-metrics/code/models/AUCMetric.php
deleted file mode 100644
index 68608efeb8..0000000000
--- a/auc-metrics/code/models/AUCMetric.php
+++ /dev/null
@@ -1,121 +0,0 @@
- 'Varchar',
- 'Value' => 'Varchar',
- 'ValueDescription' => 'Varchar',
- 'Expires' => 'SS_DateTime'
- ];
-
- /**
- * @var array
- */
- private static $has_one = [
- 'FoundationMember' => 'Member'
- ];
-
- /**
- * @var array
- */
- private static $indexes = [
- 'Identifier' => true
- ];
-
- /**
- * @var array
- */
- private static $summary_fields = [
- 'FoundationMember.Name' => 'Member Name',
- 'FoundationMember.Email' => 'Member email',
- 'Identifier' => 'Metric name',
- 'Expires.Date' => 'Expiry'
- ];
-
- /**
- * Gets all of the assigned identifiers in the database
- * @return array
- */
- public static function get_metric_identifiers()
- {
- $allowedMetrics = new SQLQuery('Identifier', 'AUCMetric');
- $allowedMetrics->setDistinct(true);
- $result = $allowedMetrics->execute();
- $identifiers = [];
-
- foreach($result as $row) {
- $identifiers[] = $row['Identifier'];
- }
-
- return $identifiers;
- }
-
- /**
- * @return FieldList
- */
- public function searchableFields()
- {
- return [
- 'MemberSearch' => [
- 'title' => 'Member name or email',
- 'field' => TextField::create('MemberSearch','Member name or email'),
- 'filter' => 'PartialMatchFilter'
- ],
- 'Metric' => [
- 'title' => 'Metric',
- 'field' => DropdownField::create(
- 'Metric',
- 'Metric',
- ArrayLib::valuekey(self::get_metric_identifiers())
- )
- ->setEmptyString('-- All metrics --'),
- 'filter' => 'ExactMatchFilter'
- ]
- ];
- }
-
- /**
- * @return FieldList
- */
- public function getCMSFields()
- {
- $fields = FieldList::create(TabSet::create('Root'));
- $fields->addFieldsToTab('Root.Main', [
- AutoCompleteField::create('FoundationMemberID','Member')
- ->setSourceClass('Member')
- ->setSourceFields([
- 'FirstName',
- 'Surname',
- 'Email',
- 'SecondEmail',
- 'ThirdEmail'
- ])
- ->setLabelField('Name')
- ->setLimit(10),
- DropdownField::create(
- 'Identifier',
- 'Metric',
- ArrayLib::valuekey(self::get_metric_identifiers())
- ),
- ReadonlyField::create('Value', $this->ValueDescription)
- ]);
-
- return $fields;
- }
-
- /**
- * @return string
- */
- public function getTitle()
- {
- return $this->Identifier;
- }
-}
\ No newline at end of file
diff --git a/auc-metrics/code/models/AUCMetricMissMatchError.php b/auc-metrics/code/models/AUCMetricMissMatchError.php
deleted file mode 100644
index 4d6fe90444..0000000000
--- a/auc-metrics/code/models/AUCMetricMissMatchError.php
+++ /dev/null
@@ -1,46 +0,0 @@
- 'Varchar',
- 'UserIdentifier' => 'Text',
- 'Solved' => 'Boolean',
- 'SolvedDate' => 'SS_Datetime',
- ];
-
- /**
- * @var array
- */
- private static $has_one = [
- 'SolvedBy' => 'Member'
- ];
-
- /**
- * @return $this
- */
- public function markAsSolved(){
- $this->Solved = true;
- $this->SolvedDate = SS_Datetime::now()->Rfc2822();
- $this->SolvedByID = Member::currentUserID();
- return $this;
- }
-}
\ No newline at end of file
diff --git a/auc-metrics/code/models/AUCMetricService.php b/auc-metrics/code/models/AUCMetricService.php
deleted file mode 100644
index 165bdde72f..0000000000
--- a/auc-metrics/code/models/AUCMetricService.php
+++ /dev/null
@@ -1,101 +0,0 @@
-repository = $repository;
- $this->member_repository = $member_repository;
- $this->tx_service = $tx_service;
- }
-
-
- /**
- * @param int $error_id
- * @param int $member_id
- * @return mixed
- * @throws NotFoundEntityException
- */
- public function fixMissMatchUserError($error_id, $member_id)
- {
- return $this->tx_service->transaction(function () use ($error_id, $member_id){
-
- $error = $this->repository->getById($error_id);
- if(is_null($error))
- throw new NotFoundEntityException();
-
- $member = $this->member_repository->getById($member_id);
- if(is_null($member))
- throw new NotFoundEntityException();
-
- $trans = new AUCMetricTranslation;
- $trans->UserIdentifier = $error->UserIdentifier;
- $trans->MappedFoundationMemberID = $member->ID;
- $trans->CreatorID = Member::currentUserID();
- $trans->write();
-
- $error->markAsSolved();
- $error->write();
-
- return $trans;
- });
- }
-
- /**
- * @param int $error_id
- * @throws NotFoundEntityException
- * @return mixed
- */
- public function deleteMissMatchUserError($error_id)
- {
- return $this->tx_service->transaction(function () use ($error_id){
-
- $error = $this->repository->getById($error_id);
- if(is_null($error))
- throw new NotFoundEntityException();
- $this->repository->delete($error);
- });
- }
-}
\ No newline at end of file
diff --git a/auc-metrics/code/models/IAUCMetricMissMatchErrorRepository.php b/auc-metrics/code/models/IAUCMetricMissMatchErrorRepository.php
deleted file mode 100644
index 30b1cb6d58..0000000000
--- a/auc-metrics/code/models/IAUCMetricMissMatchErrorRepository.php
+++ /dev/null
@@ -1,36 +0,0 @@
-getProcess($execPath);
- $process->start();
-
- while ($process->isRunning()) {
- }
-
- // executes after the command finishes
- if (!$process->isSuccessful()) {
- throw new ProcessFailedException($process);
- }
-
- $memberMap = [];
- $this->results = ResultList::create();
-
- foreach (glob($outputDir . '/*.csv') as $filename) {
- $parser = $this->createCommitterParser($filename);
- foreach ($parser as $row) {
- $email = $row['Email'];
- $member = Member::get()->filterAny([
- 'Email' => $email,
- 'SecondEmail' => $email,
- 'ThirdEmail' => $email
- ])->first();
-
- if(!$member){
- // check translation table
- $trans = \AUCMetricTranslation::get()->filter(['UserIdentifier' => $email])->first();
- $member = $trans ? $trans->MappedFoundationMember() : null;
- }
-
- if(!$member){
-
- if(\AUCMetricMissMatchError::get()->filter
- (
- [
- "ServiceIdentifier" => $this->getMetricIdentifier(),
- "UserIdentifier" => $email
- ]
- )->count() == 0)
- {
- $error = new \AUCMetricMissMatchError();
- $error->ServiceIdentifier = $this->getMetricIdentifier();
- $error->UserIdentifier = $email;
- $error->write();
- }
- $this->logError("Member with email " . $row['Email'] . " not found");
- continue;
- }
-
- if (!isset($memberMap[$member->Email])) {
- $memberMap[$member->Email] = [];
- }
- $memberMap[$member->Email][] = basename($filename, '.csv');
- }
-
- unlink($filename);
- }
-
- foreach ($memberMap as $email => $repos) {
- $member = Member::get()->filter('Email', $email)->first();
- if (!$member) {
- $error = new \AUCMetricMissMatchError();
- $error->ServiceIdentifier = $this->getMetricIdentifier();
- $error->UserIdentifier = $email;
- $error->write();
- $this->logError("Member $email not found.");
- continue;
- }
-
- $this->results->push(Result::create(
- $member,
- implode(', ', $repos)
- ));
- }
- }
-
- /**
- * @param $filename
- * @return mixed
- */
- protected function createCommitterParser($filename)
- {
- $parser = $this->getParser($filename);
-
- $parser->provideHeaderRow([
- 'Username',
- 'Name',
- 'Email'
- ]);
-
- $parser->mapColumns([
- 'Username' => 'Username',
- 'Name' => 'Name',
- 'Email' => 'Email'
- ]);
-
- return $parser;
- }
-
-}
\ No newline at end of file
diff --git a/auc-metrics/code/services/ActiveModeratorService.php b/auc-metrics/code/services/ActiveModeratorService.php
deleted file mode 100644
index 2de1b9492c..0000000000
--- a/auc-metrics/code/services/ActiveModeratorService.php
+++ /dev/null
@@ -1,102 +0,0 @@
-getProcess($execPath);
- $process->start();
-
- while ($process->isRunning()) {
-
- }
- // executes after the command finishes
- if (!$process->isSuccessful()) {
- throw new ProcessFailedException($process);
- }
-
- $output = $process->getOutput();
- $parts = preg_split("/((\r?\n)|(\r\n?))/", $output);
- $this->results = ResultList::create();
-
- foreach ($parts as $line) {
- if (preg_match('/^Getting page: [0-9]+/', $line)) {
- continue;
- }
-
- preg_match('/(.*?)([0-9]+)\s+$/', $line, $matches);
-
- if (!$matches) {
- continue;
- }
-
- $username = trim($matches[1]);
- $value = trim($matches[2]);
-
- $member = Member::get()->filterAny([
- 'AskOpenStackUsername' => $username,
- 'Email' => $username,
- 'SecondEmail' => $username,
- 'ThirdEmail' => $username,
- 'IRCHandle' => $username,
- 'TwitterName' => $username
- ])->first();
-
- if(!$member){
- // check translation table
- $trans = \AUCMetricTranslation::get()->filter(['UserIdentifier' => $username])->first();
- $member = $trans ? $trans->MappedFoundationMember() : null;
- }
-
- if(!$member){
- if(\AUCMetricMissMatchError::get()->filter
- (
- [
- "ServiceIdentifier" => $this->getMetricIdentifier(),
- "UserIdentifier" => $username
- ]
- )->count() == 0 ) {
- $error = new \AUCMetricMissMatchError();
- $error->ServiceIdentifier = $this->getMetricIdentifier();
- $error->UserIdentifier = $username;
- $error->write();
- }
- $this->logError("Member $username not found.");
- continue;
- }
-
- $this->results->push
- (
- Result::create($member, $value)
- );
- }
- }
-}
\ No newline at end of file
diff --git a/auc-metrics/code/services/ActiveUserCommitteeWorkingGroupsService.php b/auc-metrics/code/services/ActiveUserCommitteeWorkingGroupsService.php
deleted file mode 100644
index 7c2d0d6ac5..0000000000
--- a/auc-metrics/code/services/ActiveUserCommitteeWorkingGroupsService.php
+++ /dev/null
@@ -1,136 +0,0 @@
-getProcess($execPath);
- $process->start();
-
- while($process->isRunning()) {}
-
- if (!$process->isSuccessful()) {
- throw new ProcessFailedException($process);
- }
-
- $execPath = Controller::join_links(
- BASE_PATH,
- AUC_METRICS_DIR,
- 'lib/uc-recognition/tools/get_active_wg_members.py --datadir=' . $collectionDir
- );
-
- $process = $this->getProcess($execPath);
- $process->start();
-
- while ($process->isRunning()) {
- }
-
- if (!$process->isSuccessful()) {
- throw new ProcessFailedException($process);
- }
-
- $output = $process->getOutput();
-
- $fileData = explode(PHP_EOL, $output);
- $fileData[0] = "'Username','AttendanceCount','LinesSaid'";
- $csvPath = Controller::join_links(
- $outputDir,
- 'results.csv'
- );
-
- file_put_contents($csvPath, implode(PHP_EOL, $fileData));
-
- $parser = $this->getParser($csvPath);
- $parser->mapColumns([
- 'Username' => 'Username',
- 'AttendanceCount' => 'AttendanceCount',
- 'LinesSaid' => 'LinesSaid'
- ]);
-
- $this->results = ResultList::create();
-
- foreach ($parser as $row) {
- $nickname = $row['Username'];
- $attendanceCount = $row['AttendanceCount'];
- $linesSaid = $row['LinesSaid'];
-
- $member = Member::get()->filter('IRCHandle', $nickname)->first();
-
- if(!$member){
- // check translation table
- $trans = \AUCMetricTranslation::get()->filter(['UserIdentifier' => $nickname])->first();
- $member = $trans ? $trans->MappedFoundationMember() : null;
- }
-
- if(!$member){
- if(\AUCMetricMissMatchError::get()->filter
- (
- [
- "ServiceIdentifier" => $this->getMetricIdentifier(),
- "UserIdentifier" => $nickname
- ]
- )->count() == 0 ) {
- $error = new \AUCMetricMissMatchError();
- $error->ServiceIdentifier = $this->getMetricIdentifier();
- $error->UserIdentifier = $nickname;
- $error->write();
- }
- $this->logError("No member with nickname {$nickname}");
- continue;
- }
-
- $this->results->push(Result::create(
- $member,
- "$attendanceCount / $linesSaid"
- ));
-
- }
- }
-}
\ No newline at end of file
diff --git a/auc-metrics/code/services/BaseService.php b/auc-metrics/code/services/BaseService.php
deleted file mode 100644
index 03e089819f..0000000000
--- a/auc-metrics/code/services/BaseService.php
+++ /dev/null
@@ -1,44 +0,0 @@
-results;
- }
-
- /**
- * @return array
- */
- public function getErrors()
- {
- return $this->errors;
- }
-
- /**
- * @param string $err
- */
- protected function logError($err)
- {
- $this->errors[] = $err;
- }
-
-}
\ No newline at end of file
diff --git a/auc-metrics/code/services/OfficialUserGroupOrganizerService.php b/auc-metrics/code/services/OfficialUserGroupOrganizerService.php
deleted file mode 100644
index 0530f2796a..0000000000
--- a/auc-metrics/code/services/OfficialUserGroupOrganizerService.php
+++ /dev/null
@@ -1,87 +0,0 @@
-results = ResultList::create();
- $api = new \MeetupApi();
- $groups = $api->getGroups(PHP_INT_MAX);
- foreach($groups as $group){
- $members = $api->getGroupMembers($group['urlname'], PHP_INT_MAX);
- foreach($members as $member) {
- $fullName = $member['name'];
- $nameParts = explode(' ', $fullName);
- $firstName = count($nameParts) >= 1 ? $nameParts[0]: null;
- $lastName = count($nameParts) >= 2 ? $nameParts[1]: null;
- if(Member::get()->filterAny([
- 'FirstName' => $firstName,
- 'Surname' => $lastName,
- ])->count() > 1){
- $this->logError("Member with name " . $fullName . " has more than once instance on DB");
- continue;
- }
-
- $dbMember = Member::get()->filterAny([
- 'FirstName' => $firstName,
- 'Surname' => $lastName,
- ])->first();
-
- if(!$dbMember){
- if(\AUCMetricMissMatchError::get()->filter
- (
- [
- "ServiceIdentifier" => $this->getMetricIdentifier(),
- "UserIdentifier" => $fullName
- ]
- )->count() == 0 ) {
- $error = new \AUCMetricMissMatchError();
- $error->ServiceIdentifier = $this->getMetricIdentifier();
- $error->UserIdentifier = $fullName;
- $error->write();
- }
- $this->logError("Member with name " . $fullName . " not found");
- continue;
- }
-
- $this->results->push(Result::create($dbMember));
- }
- }
- }
-
- protected function getHTTPClient()
- {
- return Injector::inst()->get('AUCHTTPClient');
- }
-
-
-}
diff --git a/auc-metrics/code/services/SuperuserService.php b/auc-metrics/code/services/SuperuserService.php
deleted file mode 100644
index 86d85c6868..0000000000
--- a/auc-metrics/code/services/SuperuserService.php
+++ /dev/null
@@ -1,95 +0,0 @@
-results = ResultList::create();
- $rss = new \SimplePie();
- $rss->set_feed_url('http://superuser.openstack.org/feed');
- $rss->init();
-
- foreach($rss->get_items() as $item) {
- $author = $item->get_author();
- $members = Member::get()->where("
- CONCAT_WS(' ', Member.FirstName, Member.Surname) LIKE '%{$author->name}%'
- ");
- $member = $members->first();
- $count = (int) $members->count();
-
- if($count === 0 && !$member) {
- // check translation table
- $trans = \AUCMetricTranslation::get()->filter(['UserIdentifier' => $author->name])->first();
- $member = $trans ? $trans->MappedFoundationMember() : null;
- }
-
- if($count === 0 && !$member) {
- if(\AUCMetricMissMatchError::get()->filter
- (
- [
- "ServiceIdentifier" => $this->getMetricIdentifier(),
- "UserIdentifier" => $author->name
- ]
- )->count() == 0 ) {
- $error = new \AUCMetricMissMatchError();
- $error->ServiceIdentifier = $this->getMetricIdentifier();
- $error->UserIdentifier = $author->name;
- $error->write();
- }
- $this->logError("Could not find member $author");
- continue;
- }
-
- if($count > 1) {
- if(\AUCMetricMissMatchError::get()->filter
- (
- [
- "ServiceIdentifier" => $this->getMetricIdentifier(),
- "UserIdentifier" => $author->name
- ]
- )->count() == 0 ) {
- $error = new \AUCMetricMissMatchError();
- $error->ServiceIdentifier = $this->getMetricIdentifier();
- $error->UserIdentifier = $author->name;
- $error->write();
- }
- $this->logError("Author $author matched multiple Member records (".implode(', ', $members->column('Email')).")");
- continue;
- }
-
- $this->results->push(Result::create(
- $member,
- $item->get_title()
- ));
- }
- }
-
-}
\ No newline at end of file
diff --git a/auc-metrics/code/services/TrackChairService.php b/auc-metrics/code/services/TrackChairService.php
deleted file mode 100644
index 941df7ce83..0000000000
--- a/auc-metrics/code/services/TrackChairService.php
+++ /dev/null
@@ -1,49 +0,0 @@
-results = ResultList::create();
- $s = Summit::get_most_recent();
- if(is_null($s) || !$s) return;
- $chairs = $s->Categories()->relation('TrackChairs');
- foreach ($chairs as $chair) {
- $this->results->push(
- Result::create(
- $chair->Member(),
- implode(', ', $chair->Categories()->column('Title'))
- )
- );
- }
- }
-}
\ No newline at end of file
diff --git a/auc-metrics/code/tasks/AUCMetricTask.php b/auc-metrics/code/tasks/AUCMetricTask.php
deleted file mode 100644
index 55273e5752..0000000000
--- a/auc-metrics/code/tasks/AUCMetricTask.php
+++ /dev/null
@@ -1,171 +0,0 @@
-services[] = $arg;
- }
- }
-
- parent::__construct();
- }
-
-
- /**
- * @throws ValidationException
- * @throws null
- */
- public function run()
- {
- SapphireTransactionManager::getInstance()->transaction(function(){
- SS_Log::log('Running AUCMetricTask', SS_Log::INFO);
- $expiredMetrics = AUCMetric::get()
- ->where("Expires < DATE(NOW())");
-
- if($expiredMetrics->exists()) {
- $msg = "Deleting {$expiredMetrics->count()} metrics.";
- $this->writeln($msg);
- SS_Log::log($msg, SS_Log::INFO);
- $expiredMetrics->removeAll();
- }
-
- $expiryDate = date('Y-m-d', strtotime(AUCMetric::config()->expiry));
- $newMetricCount = 0;
- $errorData = ArrayList::create();
- foreach ($this->services as $service) {
- $identifier = $service->getMetricIdentifier();
- $this->writeHeader("Running service $identifier");
- try {
- $service->run();
- } catch (Exception $e) {
- $this->writeln($e->getMessage());
- SS_Log::log($e->getMessage(), SS_Log::ERR);
- continue;
- }
-
- $results = $service->getResults();
- if(!$results) {
- $this->writeln('No results!');
- continue;
- }
-
- $members = $results->getMemberList();
-
- if (!$members) {
- $this->writeln("--- no members found ---");
- continue;
- }
-
- foreach ($members as $m) {
- if ($m->hasAUCMetric($identifier)) {
- continue;
- }
-
- $m->AUCMetrics()->add(AUCMetric::create([
- 'Identifier' => $identifier,
- 'ValueDescription' => $service->getMetricValueDescription(),
- 'Value' => $results->getValueForMember($m),
- 'Expires' => $expiryDate
- ])->write());
-
- $this->writeln(sprintf(
- "Added metric to %s %s %s",
- $m->Email,
- $service->getMetricValueDescription(),
- $results->getValueForMember($m)
- ));
-
- $newMetricCount++;
- }
-
- $errors = $service->getErrors();
- if(!empty($errors)) {
- $errorList = ArrayList::create();
- foreach($errors as $e) {
- $errorList->push(ArrayData::create(['Title' => $e]));
- }
- $serviceData = ArrayData::create([
- 'Title' => $identifier,
- 'Errors' => $errorList
- ]);
-
- $errorData->push($serviceData);
- }
-
-
- }
-
- $msg = "Done. Created $newMetricCount new metric assignments";
- SS_Log::log($msg, SS_Log::INFO);
-
- $this->writeln($msg);
-
- if($errorData->exists()) {
- $email = EmailFactory::getInstance()->buildEmail(
- null,
- $this->config()->email_to,
- 'AUC Metric task: A few things need your attention'
- );
- $email->setTemplate('AUCMetricTaskEmail');
- $email->populateTemplate([
- 'Services' => $errorData
- ]);
- $email->send();
-
- }
- });
- }
-
- /**
- * Writes to the browser or the output buffer
- * @param string $msg
- */
- protected function write($msg = '')
- {
- if(Director::is_cli()) {
- fwrite(STDOUT, $msg);
- }
- else {
- echo $msg;
- }
- }
-
- /**
- * Writes a line to the browser or the output buffer
- * @param string $msg
- */
- protected function writeln($msg = '')
- {
- $ln = Director::is_cli() ? PHP_EOL : ' ';
- $this->write($msg.$ln);
- }
-
- /**
- * Writes a header browser or the output buffer
- * @param string $msg
- */
- protected function writeHeader($msg)
- {
- $this->writeln();
- $this->writeln();
- $this->writeln("*** $msg ***");
- $this->writeln();
- $this->writeln();
- }
-}
\ No newline at end of file
diff --git a/auc-metrics/code/traits/ParserCreator.php b/auc-metrics/code/traits/ParserCreator.php
deleted file mode 100644
index c9d594fa46..0000000000
--- a/auc-metrics/code/traits/ParserCreator.php
+++ /dev/null
@@ -1,23 +0,0 @@
-createWithArgs('AUCCSVParser', [$filePath, ',', "'"]);
- }
-
-}
\ No newline at end of file
diff --git a/auc-metrics/code/traits/ProcessCreator.php b/auc-metrics/code/traits/ProcessCreator.php
deleted file mode 100644
index fa6b237f75..0000000000
--- a/auc-metrics/code/traits/ProcessCreator.php
+++ /dev/null
@@ -1,23 +0,0 @@
-createWithArgs('AUCProcess', [$cmd]);
- }
-
-}
\ No newline at end of file
diff --git a/auc-metrics/lib/uc-recognition/LICENSE b/auc-metrics/lib/uc-recognition/LICENSE
deleted file mode 100644
index 8dada3edaf..0000000000
--- a/auc-metrics/lib/uc-recognition/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "{}"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright {yyyy} {name of copyright owner}
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/auc-metrics/lib/uc-recognition/README.md b/auc-metrics/lib/uc-recognition/README.md
deleted file mode 100644
index d0fefb98c7..0000000000
--- a/auc-metrics/lib/uc-recognition/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# uc-recognition
-This repository contains scripts and useful references to track contributions to OpenStack by users
-
-Find active moderators on Ask OpenStack:
-* get_active_moderator.py
-
-Uses IRC logs to attempt to determine active working group members:
-* get_meeting_data.sh
-* get_active_wg_members.py
-
-# tasks need folliwing python dependencies
-
-pip install paramiko
-pip install requests
\ No newline at end of file
diff --git a/auc-metrics/lib/uc-recognition/tools/get_active_commiters.py b/auc-metrics/lib/uc-recognition/tools/get_active_commiters.py
deleted file mode 100755
index 0be72cb3f2..0000000000
--- a/auc-metrics/lib/uc-recognition/tools/get_active_commiters.py
+++ /dev/null
@@ -1,172 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (C) 2013-2014 OpenStack Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-# implied.
-#
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# Soren Hansen wrote the original version of this script.
-# James Blair hacked it up to include email addresses from gerrit.
-# Jeremy Stanley overhauled it for gerrit 2.8 and our governance repo.
-# Tom Fifield cut it to pieces as a quick hack for the UC recognition to be
-# replaced with something nicer at the earliest possible time
-
-import datetime
-import json
-import optparse
-import os
-import os.path
-import re
-import io
-
-import paramiko
-
-MAILTO_RE = re.compile('mailto:(.*)')
-USERNAME_RE = re.compile('username:(.*)')
-
-class Account(object):
- def __init__(self, num):
- self.num = num
- self.full_name = ''
- self.emails = []
- self.username = None
-
-
-def get_account(accounts, num):
- a = accounts.get(num)
- if not a:
- a = Account(num)
- accounts[num] = a
- return a
-
-
-def repo_stats(repo, output, begin, end, keyfile, user, keyfilepassword):
- username_accounts = {}
- atcs = []
-
- QUERY = "project:%s status:merged" % repo
-
- client = paramiko.SSHClient()
- client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- client.load_system_host_keys()
-
- client.connect(
- 'review.openstack.org', port=29418,
- key_filename=os.path.expanduser(keyfile), username=user, password=keyfilepassword)
- stdin, stdout, stderr = client.exec_command(
- 'gerrit query %s --all-approvals --format JSON' % QUERY)
-
- done = False
- last_sortkey = ''
- begin_time = datetime.datetime(
- int(begin[0:4]), int(begin[4:6]), int(begin[6:8]),
- int(begin[8:10]), int(begin[10:12]), int(begin[12:14]))
- end_time = datetime.datetime(
- int(end[0:4]), int(end[4:6]), int(end[6:8]),
- int(end[8:10]), int(end[10:12]), int(end[12:14]))
-
- count = 0
- earliest = datetime.datetime.now()
- while not done:
- for l in stdout:
- data = json.loads(l)
- if 'rowCount' in data:
- if data['rowCount'] < 500:
- done = True
- continue
- count += 1
- if 'sortKey' in data.keys():
- last_sortkey = data['sortKey']
- if 'owner' not in data:
- continue
- if 'username' not in data['owner']:
- continue
- account = Account(None)
- account.username = data['owner']['username']
- account.emails = [data['owner']['email']]
- account.full_name = data['owner']['name']
- approved = False
- for ps in data['patchSets']:
- if 'approvals' not in ps:
- continue
- for aprv in ps['approvals']:
- if aprv['type'] != 'SUBM':
- continue
- ts = datetime.datetime.fromtimestamp(aprv['grantedOn'])
- if ts < begin_time or ts > end_time:
- continue
- approved = True
- if ts < earliest:
- earliest = ts
- if approved and account not in atcs:
- atcs.append(account)
- if not done:
- stdin, stdout, stderr = client.exec_command(
- 'gerrit query %s resume_sortkey:%s --all-approvals'
- ' --format JSON' % (QUERY, last_sortkey))
-
- print 'repo: %s' % repo
- print 'examined %s changes' % count
- print 'earliest timestamp: %s' % earliest
-
- if not os.path.exists(os.path.dirname(output)):
- try:
- os.makedirs(os.path.dirname(output))
- except OSError as exc: # Guard against race condition
- if exc.errno != errno.EEXIST:
- raise
-
- output_file = io.open(output, 'w', encoding='UTF-8')
- for a in atcs:
- output_file.write(a.username + ","+ a.full_name + "," + a.emails[0] + "\n")
- output_file.close()
-
-
-def main():
- now = ''.join(
- '%02d' % x for x in datetime.datetime.utcnow().utctimetuple()[:6])
-
- optparser = optparse.OptionParser()
- optparser.add_option(
- '-b', '--begin', help='begin date/time (e.g. 20131017000000)')
- optparser.add_option(
- '-e', '--end', default=now, help='end date/time (default is now)')
- optparser.add_option(
- '-k', '--keyfile', default='~/.ssh/id_rsa',
- help='SSH key (default is ~/.ssh/id_rsa)')
- optparser.add_option(
- '-s', '--password', default=None,
- help='SSH key Password(default is blank)')
- optparser.add_option(
- '-p', '--path', default='.',
- help='Output path, e.g. /path/to/output')
-
- options, args = optparser.parse_args()
- user = args[0]
-
- projects = ['openstack/ops-tags-team',
- 'openstack/osops-tools-monitoring',
- 'openstack/osops-tools-generic',
- 'openstack/osops-example-configs',
- 'openstack/osops-tools-logging',
- 'openstack/osops-tools-contrib']
-
- for repo in projects:
- output = '%s/%s.csv' % (options.path, repo.split('/')[-1])
- repo_stats(repo, output, options.begin, options.end,
- options.keyfile, user, options.password)
-
-
-if __name__ == "__main__":
- main()
diff --git a/auc-metrics/lib/uc-recognition/tools/get_active_moderator.py b/auc-metrics/lib/uc-recognition/tools/get_active_moderator.py
deleted file mode 100755
index 47edee75c2..0000000000
--- a/auc-metrics/lib/uc-recognition/tools/get_active_moderator.py
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright (c) 2016 OpenStack Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-# implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import datetime
-import json
-import requests
-import time
-
-user_list = 'https://ask.openstack.org/en/api/v1/users/'
-
-params = dict(
- sort='reputation',
- page=1
-)
-
-
-def get_user_data(karma_level):
- """
- Loop through the user list to find users that have greater karma than
- karma level.
- Returns a list of user data dicts.
- """
- page = 1
- session = requests.Session()
- response = session.get(user_list, params=params)
- user_data = json.loads(response.text)['users']
- while user_data[-1]['reputation'] >= karma_level:
- page = page + 1
- params.update({'page': page})
- print "Getting page: %d" % page
- response = session.get(user_list, params=params)
- user_data.extend(json.loads(response.text)['users'])
- time.sleep(3)
-
- # since pages are big chunks, we will have some users that are
- # having karma lower than karma_level in the last page. Remove them.
- while user_data[-1]['reputation'] < karma_level:
- user_data.pop()
-
- return user_data
-
-
-def get_active_users(user_data, last_active_days=180):
- """
- Give a list of user dict objects, return the ones that
- were active within the number of days specificed by
- last_active days.
- Prints a list of usernames, reputations and IDs
- """
-
- now = datetime.datetime.now()
- active_threshold = now - datetime.timedelta(days=last_active_days)
- for user in user_data:
- last_seen_at = datetime.datetime.fromtimestamp(
- int(user['last_seen_at']))
- if last_seen_at > active_threshold:
- print "{: <20} {: <20}".format(user['username'], str(user['id']))
-
-
-def main():
- user_data = get_user_data(karma_level=200)
- get_active_users(user_data, last_active_days=180)
-
-
-if __name__ == "__main__":
- main()
diff --git a/auc-metrics/lib/uc-recognition/tools/get_active_wg_members.py b/auc-metrics/lib/uc-recognition/tools/get_active_wg_members.py
deleted file mode 100755
index 56a3af8bf7..0000000000
--- a/auc-metrics/lib/uc-recognition/tools/get_active_wg_members.py
+++ /dev/null
@@ -1,176 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright (c) 2016 OpenStack Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-# implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-from datetime import datetime
-from datetime import timedelta
-import operator
-import optparse
-import os
-
-meeting_mappings = {
-'uc': 'user_committee',
-'product_team': 'product_working_group',
-'large_deployments_team_monthly_meeting': 'large_deployment_team',
-'ops_meetup_team': 'ops_meetups_team',
-'operators_telco_nfv': 'telcowg',
-}
-
-
-def get_recent_meets(log_dir, last_active_days=180):
- """
- takes a directory heirachy that only contains meetbot
- txt summary files, determines the users active within
- the threshold. Returns a dictionary that has
- one entry per meeting category, containing information about
- who attended which meetings and how much they said.
- """
- meetings = {}
- now = datetime.now()
- active_threshold = now - timedelta(days=last_active_days)
-
- # get our list of meetings and timestamps
- for root, dirs, files in os.walk(log_dir):
- if len(files) > 0:
- for txt_summary in files:
- (meet_name, meet_date) = txt_summary.split('.', 1)
- meet_date = meet_date[0:-4] # drop the .txt at the end
- if meet_name in meeting_mappings.keys():
- meet_name = meeting_mappings[meet_name]
- meet_timestamp = datetime.strptime(meet_date, "%Y-%m-%d-%H.%M")
- if meet_timestamp > active_threshold:
- if meet_name not in meetings.keys():
- meetings[meet_name] = []
- meet_file = root + "/" + txt_summary
- meetings[meet_name].append(get_people_in_meeting(meet_file))
-
- return meetings
-
-
-def get_people_in_meeting(meeting_txt):
- """
- takes a meetbot summary file that has a section with the following format
- and returns a dict with username<->lines said mapping
-
- People present (lines said)
- ---------------------------
-
- * username (117)
- * username2 (50)
- """
- meeting_people = []
- in_people = False
- txt_file = open(meeting_txt)
- for line in txt_file:
- if line == "People present (lines said)\n":
- in_people = True
- elif not in_people:
- next
- elif in_people and '*' not in line:
- next
- elif in_people and 'openstack' not in line:
- ircnic, linessaid = line[2:-2].split('(')
- ircnic = ircnic.strip(" _").lower()
- meeting_people.append((ircnic, linessaid))
-
- txt_file.close()
- return meeting_people
-
-
-def get_meeting_aggregates(meeting_data):
- """
- Aggregates the attendance counts and lines said for users across
- a meeting category
- """
- meeting_aggregate = {}
- for meeting_name in meeting_data.keys():
- meeting_users = {}
- for meeting in meeting_data[meeting_name]:
- for user_tuple in meeting:
- if user_tuple[0] not in meeting_users.keys():
- meeting_users[user_tuple[0]] = {'attendance_count': 1,
- 'lines_said': int(user_tuple[1])}
- else:
- meeting_users[user_tuple[0]]["attendance_count"] += 1
- meeting_users[user_tuple[0]]["lines_said"] += int(user_tuple[1])
- meeting_aggregate[meeting_name] = meeting_users
- return meeting_aggregate
-
-
-def print_meet_stats(meeting_data):
- for meeting_name in meeting_data.keys():
- print "\n" + meeting_name + "\n=====================================\n"
- sorted_users = sorted(meeting_data[meeting_name].items(), reverse=True,
- key=operator.itemgetter(1))
- for user in sorted_users:
- print "{: <20} {: <20} {: <20}".format(user[0],
- user[1]["attendance_count"],
- user[1]["lines_said"])
-
-
-def print_eligible_usernames(meeting_data, num_meetings=1, lines_said=1, human=False):
- user_aggregate = {}
- for meeting_name in meeting_data.keys():
- for user_tuple in meeting_data[meeting_name].items():
- if user_tuple[0] not in user_aggregate.keys():
- user_aggregate[user_tuple[0]] = user_tuple[1]
- else:
- user_aggregate[user_tuple[0]]["lines_said"] += user_tuple[1]["lines_said"]
- user_aggregate[user_tuple[0]]["attendance_count"] += user_tuple[1]["attendance_count"]
- if human:
- print "\n OVERALL STATS \n=====================================\n"
- sorted_users = sorted(user_aggregate.items(), reverse=True,
- key=operator.itemgetter(1))
- for user in sorted_users:
- if user[1]["attendance_count"] >= num_meetings or user[1]["lines_said"] >= lines_said:
- if human:
- print "{: <20} {: <20} {: <20}".format(user[0],
- user[1]["attendance_count"],
- user[1]["lines_said"])
- else:
- print "{},{},{}".format(user[0],
- user[1]["attendance_count"],
- user[1]["lines_said"])
-
-
-def main():
- optparser = optparse.OptionParser()
- optparser.add_option(
- '--human', help='If set, output results in human-readable format',
- default=False, action="https://github.com/store_true")
- optparser.add_option(
- '-d', '--datadir', help='Where meeting data lives',
- default='./eavesdrop.openstack.org/meetings')
- optparser.add_option(
- '-t', '--days', help='Validity of attendance in days',
- type="int", default=183)
- optparser.add_option(
- '-n', '--nummeetings', help='Required number of meetings',
- type="int", default=2)
- optparser.add_option(
- '-l', '--linessaid', help='Required number of line said',
- type="int", default=10)
- options, args = optparser.parse_args()
-
- meeting_data = get_recent_meets(options.datadir, options.days)
- meeting_aggregate = get_meeting_aggregates(meeting_data)
- if options.human:
- print_meet_stats(meeting_aggregate)
- print_eligible_usernames(meeting_aggregate, options.nummeetings,
- options.linessaid, options.human)
-
-if __name__ == "__main__":
- main()
diff --git a/auc-metrics/lib/uc-recognition/tools/get_meeting_data.sh b/auc-metrics/lib/uc-recognition/tools/get_meeting_data.sh
deleted file mode 100755
index 2562ab941a..0000000000
--- a/auc-metrics/lib/uc-recognition/tools/get_meeting_data.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-#
-# Downloads the TXT summary file from the meetbot records
-# at OpenStack for specific meetings
-
-MEETINGS="operators_ops_tools_monitoring ops_tags _operator_tags"
-MEETINGS="$MEETINGS large_deployment_team large_deployments_team"
-MEETINGS="$MEETINGS large_deployments_team_monthly_meeting"
-MEETINGS="$MEETINGS log_wg openstack_operators ops_meetups_team ops_meetup_team"
-MEETINGS="$MEETINGS product_team product_work_group product_working_group"
-MEETINGS="$MEETINGS scientific_wg telcowg uc user_committee wos_mentoring"
-MEETINGS="$MEETINGS massively_distributed_clouds operators_telco_nfv"
-
-for meeting in $MEETINGS
-do
- wget --no-parent --no-clobber --recursive --accept "*.txt" --reject="*.log.txt" http://eavesdrop.openstack.org/meetings/$meeting/ -P $1
-done
diff --git a/auc-metrics/lib/uc-recognition/tools/ops-tags-team.csv b/auc-metrics/lib/uc-recognition/tools/ops-tags-team.csv
deleted file mode 100644
index 2eebf0aa80..0000000000
--- a/auc-metrics/lib/uc-recognition/tools/ops-tags-team.csv
+++ /dev/null
@@ -1,7 +0,0 @@
-fifieldt,Tom Fifield,tom@openstack.org
-shamail,Shamail Tahir,ItzShamail@gmail.com
-fifieldt,Tom Fifield,tom@openstack.org
-shamail,Shamail Tahir,ItzShamail@gmail.com
-lsell,Lauren Sell,lauren@openstack.org
-maishsk,Maish Saidel-Keesing,maishsk@gmail.com
-devananda,Devananda van der Veen,devananda.vdv@gmail.com
diff --git a/auc-metrics/lib/uc-recognition/tools/osops-tools-monitoring.csv b/auc-metrics/lib/uc-recognition/tools/osops-tools-monitoring.csv
deleted file mode 100644
index a07b75f49b..0000000000
--- a/auc-metrics/lib/uc-recognition/tools/osops-tools-monitoring.csv
+++ /dev/null
@@ -1,14 +0,0 @@
-mmagr,Martin Mágr,mmagr@redhat.com
-mmagr,Martin Mágr,mmagr@redhat.com
-jbadiapa,Juan Badia Payno,jbadiapa@redhat.com
-dc_mattj,Matt Jarvis,matt.jarvis@datacentred.co.uk
-dc_mattj,Matt Jarvis,matt.jarvis@datacentred.co.uk
-mmagr,Martin Mágr,mmagr@redhat.com
-mmagr,Martin Mágr,mmagr@redhat.com
-ghantoos,Ignace Mouzannar,ignace@redhat.com
-ghantoos,Ignace Mouzannar,ignace@redhat.com
-emilienm,Emilien Macchi,emilien@redhat.com
-gd-mdorman,Mike Dorman,mdorman@godaddy.com
-ElCoyote,Vincent S. Cojot,vincent@cojot.name
-chem,Athlan-Guyot sofer,sathlang@redhat.com
-chem,Athlan-Guyot sofer,sathlang@redhat.com
diff --git a/auc-metrics/templates/AUCMetricTaskEmail.ss b/auc-metrics/templates/AUCMetricTaskEmail.ss
deleted file mode 100644
index 8064d5e6d8..0000000000
--- a/auc-metrics/templates/AUCMetricTaskEmail.ss
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-$ModuleJS('metrics-list', false , "auc-metrics")
-$ModuleCSS('metrics-list', false , "auc-metrics")
-
diff --git a/auc-metrics/ui/source/js/metrics_list/AucMetricsListApp.js b/auc-metrics/ui/source/js/metrics_list/AucMetricsListApp.js
deleted file mode 100644
index 40ce165546..0000000000
--- a/auc-metrics/ui/source/js/metrics_list/AucMetricsListApp.js
+++ /dev/null
@@ -1,187 +0,0 @@
-/**
- * Copyright 2018 OpenStack Foundation
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- **/
-import React from 'react';
-import { connect } from 'react-redux';
-import { fetchPage, exportAll, } from './actions';
-import BaseReport from "~core-components/base_report";
-
-class DatePicker extends React.Component {
- componentDidMount() {
- let _this = this;
- let {onChange} = this.props;
- $(this.textInput).datetimepicker({
- format: 'Y-m-d H:i:00',
- step: 1,
- formatDate: 'Y-m-d',
- formatTime: 'H:i:00',
- defaultTime: '23:59:00'
- });
-
- $(this.textInput).change(function(){
- onChange({currentTarget:_this.textInput});
- })
- }
-
- componentWillUnmount() {
- $(this.textInput).datetimepicker('destroy');
- }
-
- render() {
- const {className, defaultValue, placeHolder} = this.props;
- return { this.textInput = input; }}
- placeholder={placeHolder}
- defaultValue={defaultValue}
- className={className}
- type="text" />
- }
-}
-
-class AucMetricsListApp extends BaseReport {
-
- constructor(props) {
- super(props);
- this.state = {
- ...this.state,
- from_date: null,
- to_date: null,
- };
- }
-
- componentDidMount() {
- let _this = this;
- if (!this.props.items.length) {
- this.props.fetchPage({
- page: this.state.current_page,
- page_size: this.state.page_size,
- search_term: this.state.search_term,
- order: this.buildSort(),
- 'filter[]':this.buildFilter(),
- });
- }
- }
-
- onExport(e){
- e.preventDefault();
- this.props.exportAll({
- search_term: this.state.search_term,
- type: this.state.type,
- order: this.buildSort(),
- 'filter[]':this.buildFilter(),
- });
- }
-
- componentDidUpdate(prevProps, prevState) {
- if
- (
- prevState.sort_direction != this.state.sort_direction ||
- prevState.sort_field != this.state.sort_field ||
- prevState.current_page != this.state.current_page ||
- prevState.type != this.state.type ||
- prevState.search_term != this.state.search_term ||
- prevState.page_size != this.state.page_size ||
- this.shouldUpdateByDates(prevState)
- )
- this.props.fetchPage({
- page: this.state.current_page,
- page_size: this.state.page_size,
- search_term: this.state.search_term,
- type: this.state.type,
- order: this.buildSort(),
- 'filter[]':this.buildFilter(),
- });
- }
-
- shouldUpdateByDates(prevState){
- if
- (
- ( prevState.from_date != this.state.from_date ||
- prevState.to_date != this.state.to_date )
- && this.state.to_date && this.state.from_date
- )
- {
- let from = new Date(this.state.from_date);
- let to = new Date(this.state.to_date);
- return (from < to);
- }
- return false;
- }
-
- buildFilter(){
- if(this.state.from_date && this.state.to_date){
- let from = new Date(this.state.from_date) ;
- let to = new Date(this.state.to_date);
- if(from < to)
- return [
- `from_date>=${this.state.from_date}`,
- `to_date<=${this.state.to_date}`,
- ];
- }
- return null;
- }
-
- onChangeFromDate(e){
- let target = e.currentTarget;
- let val = target.value;
- this.setState({...this.state, from_date: val});
- }
-
- onChangeToDate(e){
- let target = e.currentTarget;
- let val = target.value;
- let filter = [];
- this.setState({...this.state, to_date: val});
- }
-
- // to override if needed
- renderColumn(item, col){
- switch(col.name){
- default:
- return item[col.name];
- }
- }
-
- // to override if needed
- renderCustomPrimaryFilter() {
- return (
-
-
-
- this.onChangeFromDate(e)}
- />
-
-
- this.onChangeToDate(e)}
- />
-
-
-
- );
- }
-}
-
-function mapStateToProps(state) {
- return {
- items: state.items,
- page_count: state.page_count,
- loading: state.loading
- }
-}
-
-export default connect(mapStateToProps, {
- fetchPage,
- exportAll,
-})(AucMetricsListApp)
diff --git a/auc-metrics/ui/source/js/metrics_list/actions.js b/auc-metrics/ui/source/js/metrics_list/actions.js
deleted file mode 100644
index 63e078d21f..0000000000
--- a/auc-metrics/ui/source/js/metrics_list/actions.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Copyright 2018 OpenStack Foundation
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- **/
-
-import { getRequest, putRequest, createAction, deleteRequest } from "~core-utils/actions";
-
-import URI from "urijs";
-
-export const REQUEST_METRICS_PAGE = 'REQUEST_METRICS_PAGE';
-export const RECEIVE_METRICS_PAGE = 'RECEIVE_METRICS_PAGE';
-
-export const fetchPage = getRequest(
- createAction(REQUEST_METRICS_PAGE),
- createAction(RECEIVE_METRICS_PAGE),
- 'api/v1/sangria/auc-metrics'
-);
-
-export const exportAll = (params) => (dispatch) => {
- let url = URI('api/v1/sangria/auc-metrics/csv').query(params).toString();
- window.open(url);
-}
diff --git a/auc-metrics/ui/source/js/metrics_list/index.js b/auc-metrics/ui/source/js/metrics_list/index.js
deleted file mode 100644
index a90e8a275f..0000000000
--- a/auc-metrics/ui/source/js/metrics_list/index.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * Copyright 2018 OpenStack Foundation
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- **/
-import React from 'react';
-import { render } from 'react-dom';
-import { Provider } from 'react-redux';
-import AucMetricsListApp from './AucMetricsListApp';
-import store from './store';
-import './styles.less';
-
-const containerId = 'auc-metrics-list-app-container';
-
-document.addEventListener('DOMContentLoaded', function init() {
- if (document.getElementById(containerId)) {
- render(
-
-
- ,
- document.getElementById(containerId)
- );
- }
-});
-
-
diff --git a/auc-metrics/ui/source/js/metrics_list/styles.less b/auc-metrics/ui/source/js/metrics_list/styles.less
deleted file mode 100644
index e7dc588711..0000000000
--- a/auc-metrics/ui/source/js/metrics_list/styles.less
+++ /dev/null
@@ -1,5 +0,0 @@
-.container
-{
- padding: 0;
- width: 95% !important;
-}
\ No newline at end of file
diff --git a/auc-metrics/ui/source/js/missmatch_users/AucMetricsFixUserConflictsApp.js b/auc-metrics/ui/source/js/missmatch_users/AucMetricsFixUserConflictsApp.js
deleted file mode 100644
index b991aa8deb..0000000000
--- a/auc-metrics/ui/source/js/missmatch_users/AucMetricsFixUserConflictsApp.js
+++ /dev/null
@@ -1,229 +0,0 @@
-/**
- * Copyright 2018 OpenStack Foundation
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- **/
-import React from 'react';
-import { connect } from 'react-redux';
-import { fetchPage, queryMembers, resolveMissMatch, deleteError } from './actions';
-import BaseReport from "~core-components/base_report";
-import 'sweetalert2/dist/sweetalert2.css';
-import swal from 'sweetalert2';
-
-class AucMetricsFixUserConflictsApp extends BaseReport {
-
- constructor(props) {
- super(props);
- this.state = {
- ...this.state,
- membersAutoComplete: [],
- selectedMember: null,
- selectedIdentifier:null,
- };
- }
-
- clearSolveState(){
- this.setState({...this.state,
- membersAutoComplete: [],
- selectedMember: null,
- selectedIdentifier:null});
- this.memberIdentifier.value = '';
- }
-
- componentDidMount() {
- let _this = this;
- if (!this.props.items.length) {
- this.props.fetchPage({
- page: this.state.current_page,
- page_size: this.state.page_size,
- search_term: this.state.search_term,
- order: this.buildSort(),
- });
- }
- $('#modal_resolve').on('hidden.bs.modal', function (e) {
- _this.clearSolveState();
- })
- }
-
- componentDidUpdate(prevProps, prevState) {
- if
- (
- prevState.sort_direction != this.state.sort_direction ||
- prevState.sort_field != this.state.sort_field ||
- prevState.current_page != this.state.current_page ||
- prevState.type != this.state.type ||
- prevState.search_term != this.state.search_term ||
- prevState.page_size != this.state.page_size
- )
- this.props.fetchPage({
- page: this.state.current_page,
- page_size: this.state.page_size,
- search_term: this.state.search_term,
- type: this.state.type,
- order: this.buildSort(),
- });
- }
-
- onSelectedMember(e, item){
- console.log(item);
- this.setState({...this.state, membersAutoComplete:[], selectedMember: item});
- this.memberIdentifier.value = item.name;
- this.memberIdentifier.focus();
- }
-
- renderOnFooter(){
-
- return (
-
-
-
-
-
-
AUC Metrics - Solve User MissMatch
-
-
-
-
-
-
-
-
-
-
-
- );
- }
-
- // to override if needed
- renderColumn(item, col){
- switch(col.name){
- case 'action_buttons':
- return (
-
-
-
-
- );
- default:
- return item[col.name];
- }
- }
-
- onChangeAutoComplete(e){
- let _this = this;
- queryMembers(e.target.value).then(function(items){
- _this.setState({..._this.state, membersAutoComplete: items, selectedMember: null})
- })
- }
-
- // to override if needed
- renderCustomPrimaryFilter() {
- return null;
- }
-
- onShowSolveModal(e, item) {
- let _this = this;
- e.preventDefault();
- $('#modal_resolve').modal('show');
- this.setState({...this.state, selectedIdentifier:item});
- }
-
- onDeleteError(e, item){
- e.preventDefault();
- swal({
- title: 'Are you sure?',
- text: 'This action is not undoable',
- type: 'warning',
- showCancelButton: true,
- confirmButtonText: 'Yes, Remove it!',
- cancelButtonText: 'No, keep it'
- }).then((result) => {
- if (result) {
- this.remove(item);
- }
- })
- }
-
- remove(item){
- this.props.deleteError(item).then( () => {
- this.fetchPage();
- });
- }
-
- onDoSolve(e){
- e.preventDefault();
- let { selectedIdentifier, selectedMember } = this.state;
- if(selectedIdentifier == null || selectedMember == null ) return;
- swal({
- title: 'Are you sure?',
- text: 'This action is not undoable',
- type: 'warning',
- showCancelButton: true,
- confirmButtonText: 'Yes, fix it!',
- cancelButtonText: 'No, keep it'
- }).then((result) => {
- if (result) {
- this.solve();
- }
- })
- }
-
- solve(){
- let { selectedIdentifier, selectedMember } = this.state;
- if(selectedIdentifier == null || selectedMember == null ) return;
-
- $('#modal_resolve').modal('hide');
- this.clearSolveState();
- this.props.resolveMissMatch(selectedIdentifier, selectedMember).then( () => {
- this.fetchPage();
- });
- }
-
- getUserIdentifier(){
- return this.state.selectedIdentifier != null ? this.state.selectedIdentifier.user_identifier : '';
- }
-}
-
-function mapStateToProps(state) {
- return {
- items: state.items,
- page_count: state.page_count,
- loading: state.loading
- }
-}
-
-export default connect(mapStateToProps, {
- fetchPage,
- resolveMissMatch,
- deleteError
-})(AucMetricsFixUserConflictsApp)
diff --git a/auc-metrics/ui/source/js/missmatch_users/actions.js b/auc-metrics/ui/source/js/missmatch_users/actions.js
deleted file mode 100644
index d720891634..0000000000
--- a/auc-metrics/ui/source/js/missmatch_users/actions.js
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
- * Copyright 2018 OpenStack Foundation
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- **/
-import { getRequest, putRequest, createAction, deleteRequest } from "~core-utils/actions";
-
-import URI from "urijs";
-
-export const RECEIVE_MISSMATCH_ERROR_PAGE = 'RECEIVE_MISSMATCH_ERROR_PAGE';
-export const REQUEST_MISSMATCH_ERROR_PAGE = 'REQUEST_MISSMATCH_ERROR_PAGE';
-export const ERROR_RESOLVING = 'ERROR_RESOLVING';
-export const ERROR_RESOLVED = 'ERROR_RESOLVED';
-export const ERROR_DELETING = 'ERROR_DELETING';
-export const ERROR_DELETED = 'ERROR_DELETED';
-
-export const fetchPage = getRequest(
- createAction(REQUEST_MISSMATCH_ERROR_PAGE),
- createAction(RECEIVE_MISSMATCH_ERROR_PAGE),
- 'api/v1/sangria/auc-metrics/user-miss-matches'
-);
-
-export const fetchResponseHandler = (response) => {
- if (!response.ok) {
- throw response;
- } else {
- return response.json();
- }
-}
-
-export const resolveMissMatch = (missmatch, member) => dispatch => {
- let payload = {
- member_id : member.id
- }
- return putRequest(
- createAction(ERROR_RESOLVING),
- createAction(ERROR_RESOLVED),
- `api/v1/sangria/auc-metrics/user-miss-matches/${missmatch.id}`,
- payload
- )({})(dispatch);
-}
-
-export const deleteError = (missmatch) => dispatch => {
- return deleteRequest(
- createAction(ERROR_DELETING),
- createAction(ERROR_DELETED),
- `api/v1/sangria/auc-metrics/user-miss-matches/${missmatch.id}`,
- {}
- )({})(dispatch);
-}
-
-export const queryMembers = (input) => {
- input = input.split(" ");
-
- let filters = '';
- for(let q of input) {
- q = encodeURIComponent(q);
- if(filters != '') filters += ',';
- filters += `first_name=@${q},last_name=@${q},email=@${q}`;
- }
-
- return fetch(`${ApiBaseUrl}/api/public/v1/members?filter=${filters}`)
- .then(fetchResponseHandler)
- .then((json) => {
- return json.data.map((m) =>
- ({id: m.id, name: m.first_name + ' ' + m.last_name + ' (' + m.id + ')'})
- );
- })
- .catch(fetchErrorHandler);
-};
-
-export const fetchErrorHandler = (response) => {
- let code = response.status;
- let msg = response.statusText;
-
- switch (code) {
- case 403:
- break;
- case 401:
- break;
- case 412:
- case 500:
- break
- }
-}
\ No newline at end of file
diff --git a/auc-metrics/ui/source/js/missmatch_users/index.js b/auc-metrics/ui/source/js/missmatch_users/index.js
deleted file mode 100644
index 2dd781f87a..0000000000
--- a/auc-metrics/ui/source/js/missmatch_users/index.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * Copyright 2018 OpenStack Foundation
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- **/
-
-import React from 'react';
-import { render } from 'react-dom';
-import { Provider } from 'react-redux';
-import AucMetricsFixUserConflictsApp from './AucMetricsFixUserConflictsApp';
-import store from './store';
-import './styles.less';
-const containerId = 'auc-metrics-fix-conflicts-app-container';
-
-document.addEventListener('DOMContentLoaded', function init() {
- if (document.getElementById(containerId)) {
- render(
-
-
- ,
- document.getElementById(containerId)
- );
- }
-});
-
-
diff --git a/auc-metrics/ui/source/js/missmatch_users/reducers.js b/auc-metrics/ui/source/js/missmatch_users/reducers.js
deleted file mode 100644
index 61cbb5cb8e..0000000000
--- a/auc-metrics/ui/source/js/missmatch_users/reducers.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * Copyright 2018 OpenStack Foundation
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- **/
-
-import {RECEIVE_MISSMATCH_ERROR_PAGE, REQUEST_MISSMATCH_ERROR_PAGE, ERROR_RESOLVED } from './actions';
-
-export const aucUserMissMatchesErrors = (
- state = {
- items : [],
- page_count: 0,
- page_size: 0,
- loading: false,
- },
- action = {}
-) => {
- switch(action.type){
- case REQUEST_MISSMATCH_ERROR_PAGE:
- {
- const { page_size } = action.payload;
- return {
- ...state,
- page_size: page_size,
- loading: true,
- }
- }
- break;
- case RECEIVE_MISSMATCH_ERROR_PAGE:
- {
- const { response } = action.payload;
- let page_count = state.page_size > 0 ? parseInt(Math.ceil(response.count/state.page_size)) : 0;
- console.log(`page_count ${page_count}`);
- return {
- ...state,
- items: response.items,
- page_count ,
- loading: false
- }
- }
- break;
- default:
- return state;
- }
-};
\ No newline at end of file
diff --git a/auc-metrics/ui/source/js/missmatch_users/store.js b/auc-metrics/ui/source/js/missmatch_users/store.js
deleted file mode 100644
index 5715702188..0000000000
--- a/auc-metrics/ui/source/js/missmatch_users/store.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Copyright 2018 OpenStack Foundation
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- **/
-
-
-import { createStore, applyMiddleware, combineReducers, compose} from 'redux';
-import reduceReducers from 'reduce-reducers';
-import thunk from 'redux-thunk';
-import {aucUserMissMatchesErrors} from './reducers';
-import { genericReducers } from "~core-utils/reducers";
-
-const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
-
-let reducer = reduceReducers(aucUserMissMatchesErrors, genericReducers);
-const store = createStore(reducer, composeEnhancers(applyMiddleware(thunk)));
-
-export default store;
\ No newline at end of file
diff --git a/auc-metrics/ui/source/js/missmatch_users/styles.less b/auc-metrics/ui/source/js/missmatch_users/styles.less
deleted file mode 100644
index aa61494c65..0000000000
--- a/auc-metrics/ui/source/js/missmatch_users/styles.less
+++ /dev/null
@@ -1,24 +0,0 @@
-.bootstrap-tagsinput {
- width: 100%;
-}
-
-.member-autocomplete-menu {
- list-style-type: none;
- border: 1px solid black;
- padding: 0;
- margin: 0;
- li{
- height: 30px;
- padding: 5px;
- }
- li:hover{
- background-color:#ead6b7;
- font-weight: bold;
- cursor: pointer;
- }
-}
-
-.btn-solve
-{
- margin-right: 10px;
-}
diff --git a/auc-metrics/ui/webpack.config.js b/auc-metrics/ui/webpack.config.js
deleted file mode 100644
index 7d44d0a4d1..0000000000
--- a/auc-metrics/ui/webpack.config.js
+++ /dev/null
@@ -1,6 +0,0 @@
-module.exports = {
- entry: {
- "missmatch-users" : "./source/js/missmatch_users/index.js",
- "metrics-list" : "./source/js/metrics_list/index.js",
- }
-};
diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php
index f530cf982f..56b796717e 100644
--- a/bootstrap/autoload.php
+++ b/bootstrap/autoload.php
@@ -1,6 +1,6 @@
OpenStack skills are in high demand as thousands of companies around the world adopt and productize OpenStack.
-
Certified OpenStack Administrator (COA) is the first professional certification offered by the OpenStack Foundation. It’s designed to help companies identify top talent in the industry, and help job seekers demonstrate their skills.
+
Certified OpenStack Administrator (COA) is the first professional certification offered by the Open Infrastructure Foundation. It’s designed to help companies identify top talent in the industry, and help job seekers demonstrate their skills.
HTML;
}
return $html;
@@ -246,7 +246,7 @@ public function getGetStartedText(){
$html = $this->getField('GetStartedText');
if(empty($html)){
$html = <<The Certified OpenStack Administrator exam is the only professional certification offered by the OpenStack Foundation. It was written for OpenStack professionals with at least six months of experience managing an OpenStack cloud environment. You can learn more details about the exam below, or visit our Training Marketplace to find companies that can help you prepare and often bundle the exam with their training courses. To get started with a new exam purchase or to redeem a code, you'll be prompted to log into the COA portal with an OpenStackID or equivalent.
+
The Certified OpenStack Administrator exam is the only professional certification offered by the Open Infrastructure Foundation. It was written for OpenStack professionals with at least six months of experience managing an OpenStack cloud environment. You can learn more details about the exam below, or visit our Training Marketplace to find companies that can help you prepare and often bundle the exam with their training courses. To get started with a new exam purchase or to redeem a code, you'll be prompted to log into the COA portal with an OpenStackID or equivalent.
- Test your skills and problem solving in the command line and Horizon dashboard, based on the OpenStack Newton version
+ Test your skills and problem solving in the command line and Horizon dashboard, based on the OpenStack Caracal version
@@ -93,14 +93,14 @@
Training Partners
- The best path to certification is through one of the OpenStack Foundation training partners. Dozens of companies around the world offer OpenStack training, ranging from 101 to advanced skills. Many of these companies bundle the COA exam with their training courses. Find the best fit for you in the OpenStack Training Marketplace.
+ The best path to certification is through one of the Open Infrastructure Foundation training partners. Dozens of companies around the world offer OpenStack training, ranging from 101 to advanced skills. Many of these companies bundle the COA exam with their training courses. Find the best fit for you in the OpenStack Training Marketplace.
<% if CurrentMember.isFoundationMember %>
- <% include CurrentUserInfoBox LogOutLink=$Top.LogoutUrl, ResignLink=$Top.ResignUrl %>
+ <% include CurrentUserInfoBox LogOutLink=$Top.LogoutUrl, ResignLink=$Top.ResignUrl, RenewLink=$Top.RenewMembershipUrl %>
<% include ProfileNav %>
@@ -28,10 +28,10 @@
<% else_if NominationsForCurrentMember %>
<% if CurrentMemberHasAccepted %>
-
You have been nominated $NominationsForCurrentMember.TotalItems <% if PluralNominations %>times<% else %>time<% end_if %>, and agreed to accept the nomination. You will be listed as a candidate on the ballot when you receive 10 nominations.
+
You have been nominated $NominationsForCurrentMember.Count <% if PluralNominations %>times<% else %>time<% end_if %>, and agreed to accept the nomination. You will be listed as a candidate on the ballot when you receive 10 nominations.
You have been nominated $NominationsForCurrentMember.TotalItems <% if PluralNominations %>times<% else %>time<% end_if %>, but you have not accepted the nomination. You must accept the nomination and complete a Candidate Profile to be officially listed as a candidate for this election.
+
You have been nominated $NominationsForCurrentMember.Count <% if PluralNominations %>times<% else %>time<% end_if %>, but you have not accepted the nomination. You must accept the nomination and complete a Candidate Profile to be officially listed as a candidate for this election.
If you are an eligible voter, you should have received an email with the subject "OpenStack Foundation - 2020 Individual Director Election" from secretary@openstack.org. This email includes your unique voting link. If you did not receive an email, please contact secretary@openstack.org.
+
If you are an eligible voter, you should have received an email with the subject "Open Infrastructure Foundation - 2022 Individual Director Election" from secretary@openstack.org. This email includes your unique voting link. If you did not receive an email, please contact secretary@openinfra.dev.
To nominate other members, go to http://www.openstack.org/community/members/
Sincerely
-The OpenStack Foundation
+The Open Infrastructure Foundation
diff --git a/elections/templates/Layout/Includes/RevocationNotificationEmail.ss b/elections/templates/Layout/Includes/RevocationNotificationEmail.ss
index 0e60024ce6..f9cec8e62b 100644
--- a/elections/templates/Layout/Includes/RevocationNotificationEmail.ss
+++ b/elections/templates/Layout/Includes/RevocationNotificationEmail.ss
@@ -1,9 +1,26 @@
Dear Foundation Member,
-
According to our records, you haven't voted in at least half of the Foundation elections in the past 2 years. Per the bylaws, your membership will be suspended effective 30 days from now, on {$ExpirationDate}. This email serves as notice.
-
If you wish to remain a Member of the OpenStack Foundation you have until {$ExpirationDate} to make that request to the Secretary by visiting this page: $TakeActionLink.
-
If you take no action, we will automatically change your account status from "Foundation Member" to "Community Member". As a "Community Member" you can continue to engage in many activities on OpenStack.org including submitting talks for Summits. However, you will not have all of the rights and responsibilities of being a full Foundation Member, including voting in future Board of Directors elections.
-
If you wish to remain a Foundation Member, you have until {$ExpirationDate} to request that the Secretary reinstate your account. You also have the option to delete your account entirely. Either option may be selected on this page prior to the deadline: $TakeActionLink.
+
+ According to our records, you haven't voted in at least half of the Foundation elections in the past 2 years. Per the bylaws,
+ your membership will be suspended effective 30 days from now, on {$ExpirationDate}.. This email serves as notice.
+
+
+ If you wish to remain a Member of the OpenInfra Foundation you have until {$ExpirationDate} to make that request to
+ the Secretary by visiting this page: $TakeActionLink.
+
+
+ If you take no action, we will automatically change your account status from "Foundation Member" to "Community Member".
+ As a "Community Member" you can continue to engage in many activities on openstack.org and openinfra.org including submitting
+ talks for OpenInfra Summits. However, you will not have all of the rights and responsibilities of being a
+ full Foundation Member, including voting in future Board of Directors elections.
+
+
+
+ If you wish to remain a Foundation Member, you have until April 3 to request that the Secretary reinstate your account.
+ You also have the option to delete your account entirely. Either option may be selected on this page prior to the
+ deadline: $TakeActionLink.
+
+
Jonathan Bryce
- Executive Director and Secretary, OpenStack Foundation
- $EmailFrom
+ Executive Director and Secretary, OpenInfra Foundation
+ secretary@openinfra.dev
\ No newline at end of file
diff --git a/elections/templates/Layout/MemberListPage_confirmNomination.ss b/elections/templates/Layout/MemberListPage_confirmNomination.ss
index 6dccf061eb..9e4b84b360 100644
--- a/elections/templates/Layout/MemberListPage_confirmNomination.ss
+++ b/elections/templates/Layout/MemberListPage_confirmNomination.ss
@@ -4,7 +4,7 @@
Please confirm your nomination
-
Are you sure you would officially like to nominate $Candidate.FirstName $Candidate.Surname to the OpenStack Board?
+
Are you sure you would officially like to nominate $Candidate.FirstName $Candidate.Surname to the Open Infrastructure Foundation Board?
diff --git a/events/templates/Layout/HackathonsPage.ss b/events/templates/Layout/HackathonsPage.ss
index fffd48b575..78ee8cee3c 100644
--- a/events/templates/Layout/HackathonsPage.ss
+++ b/events/templates/Layout/HackathonsPage.ss
@@ -176,7 +176,7 @@
OpenStack Hackathon Logo and Digital Assets
- The OpenStack Foundation has created an official OpenStack Hackathon logo and digital assets to be used for all OpenStack Hackathons.
+ The Open Infrastructure Foundation has created an official OpenStack Hackathon logo and digital assets to be used for all OpenStack Hackathons.
For both trademark and legal reasons, all official OpenStack Hackathons are required to use these assets in all event
communications, printed materials, signage, and website presence. To request your official OpenStack Hackathon logo and branding
kit, please send an email to events@openstack.org
diff --git a/events/templates/Layout/OpenStackDaysPage.ss b/events/templates/Layout/OpenStackDaysPage.ss
index 2bade4c3b3..75b178c2a0 100644
--- a/events/templates/Layout/OpenStackDaysPage.ss
+++ b/events/templates/Layout/OpenStackDaysPage.ss
@@ -75,7 +75,7 @@
@@ -171,7 +171,7 @@
OpenStack Day Logo and Digital Assets
- The OpenStack Foundation has created an official OpenStack Day logo and digital assets to be used for all OpenStack Days events.
+ The Open Infrastructure Foundation has created an official OpenStack Day logo and digital assets to be used for all OpenStack Days events.
For both trademark and legal reasons, all official OpenStack Day events are required to use these assets in all event
communications, printed materials, signage, and website presence. To request your official OpenStack Day logo and branding
kit, please send an email to events@openstack.org
diff --git a/gerrit_ingest/code/infrastructure/active_records/GerritUser.php b/gerrit_ingest/code/infrastructure/active_records/GerritUser.php
index 29f5d037c1..637d13eeef 100644
--- a/gerrit_ingest/code/infrastructure/active_records/GerritUser.php
+++ b/gerrit_ingest/code/infrastructure/active_records/GerritUser.php
@@ -1,6 +1,6 @@
button>.caret{
margin-top: 6px;
+}
+
+#TranslationPriorityRanking {
+ display: none;
}
\ No newline at end of file
diff --git a/gettext/javascript/gettext.js b/gettext/javascript/gettext.js
index 15a8630582..bdf55e2226 100644
--- a/gettext/javascript/gettext.js
+++ b/gettext/javascript/gettext.js
@@ -1,5 +1,5 @@
/**
- * Copyright 2017 OpenStack Foundation
+ * Copyright 2017 Open Infrastructure Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
diff --git a/gettext/pot/survey_template.pot b/gettext/pot/survey_template.pot
index f716c2bc2d..36af77ee0a 100644
--- a/gettext/pot/survey_template.pot
+++ b/gettext/pot/survey_template.pot
@@ -66,7 +66,7 @@ msgid "Country of Residence*"
msgstr ""
# step about-you - question OkToContact label
-msgid "The OpenStack Foundation and User Committee may communicate with me in the future about my usage.*"
+msgid "The Open Infrastructure Foundation and User Committee may communicate with me in the future about my usage.*"
msgstr ""
# survey template 14 - survey step your-organization friendly name
@@ -362,7 +362,7 @@ msgid "What is your primary reason for this rating?"
msgstr ""
# question SectionBreak literal content
-msgid "
We would love to hear how OpenStack and the OpenStack Foundation can better meet your needs. These free-form questions are optional, but will provide valuable insights. Your responses are anonymous, and each of these text fields are independent, so we cannot \"see previous answer.\" We would really appreciate a separate answer to each question.
"
+msgid "
We would love to hear how OpenStack and the Open Infrastructure Foundation can better meet your needs. These free-form questions are optional, but will provide valuable insights. Your responses are anonymous, and each of these text fields are independent, so we cannot \"see previous answer.\" We would really appreciate a separate answer to each question.