gboolean gs_plugin_review_submit (GsPlugin *plugin, GsApp *app, AsReview *review, GCancellable *cancellable, GError **error) { GsPluginData *priv = gs_plugin_get_data (plugin); GsAuth *auth; const gchar *consumer_key = NULL; const gchar *language; gint rating; gint n_stars; g_autofree gchar *architecture = NULL; g_autoptr(JsonBuilder) request = NULL; guint status_code; g_autoptr(JsonParser) result = NULL; /* Ubuntu reviews require a summary and description - just make one up for now */ rating = as_review_get_rating (review); if (rating > 80) n_stars = 5; else if (rating > 60) n_stars = 4; else if (rating > 40) n_stars = 3; else if (rating > 20) n_stars = 2; else n_stars = 1; language = gs_plugin_get_language (plugin); // FIXME: Need to get Apt::Architecture configuration value from APT architecture = g_strdup ("amd64"); /* Create message for reviews.ubuntu.com */ request = json_builder_new (); json_builder_begin_object (request); add_string_member (request, "package_name", gs_app_get_source_default (app)); add_string_member (request, "summary", as_review_get_summary (review)); add_string_member (request, "review_text", as_review_get_description (review)); add_string_member (request, "language", language); add_string_member (request, "origin", priv->origin); add_string_member (request, "distroseries", priv->distroseries); add_string_member (request, "version", as_review_get_version (review)); add_int_member (request, "rating", n_stars); add_string_member (request, "arch_tag", architecture); json_builder_end_object (request); if (!send_review_request (plugin, SOUP_METHOD_POST, "/api/1.0/reviews/", request, TRUE, &status_code, &result, cancellable, error)) return FALSE; if (status_code != SOUP_STATUS_OK) { g_set_error (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED, "Failed to submit review, server returned status code %u", status_code); return FALSE; } // Extract new fields from posted review auth = gs_plugin_get_auth_by_id (plugin, "ubuntuone"); if (auth != NULL) consumer_key = gs_auth_get_metadata_item (auth, "consumer-key"); parse_review (review, consumer_key, json_parser_get_root (result)); return TRUE; }
gboolean gs_plugin_review_submit (GsPlugin *plugin, GsApp *app, AsReview *review, GCancellable *cancellable, GError **error) { GsPluginData *priv = gs_plugin_get_data (plugin); g_autofree gchar *data = NULL; g_autofree gchar *uri = NULL; g_autofree gchar *version = NULL; g_autoptr(JsonBuilder) builder = NULL; g_autoptr(JsonGenerator) json_generator = NULL; g_autoptr(JsonNode) json_root = NULL; /* save as we don't re-request the review from the server */ as_review_set_reviewer_name (review, g_get_real_name ()); as_review_add_metadata (review, "app_id", gs_app_get_id (app)); as_review_add_metadata (review, "user_skey", gs_app_get_metadata_item (app, "ODRS::user_skey")); /* create object with review data */ builder = json_builder_new (); json_builder_begin_object (builder); json_builder_set_member_name (builder, "user_hash"); json_builder_add_string_value (builder, priv->user_hash); json_builder_set_member_name (builder, "user_skey"); json_builder_add_string_value (builder, as_review_get_metadata_item (review, "user_skey")); json_builder_set_member_name (builder, "app_id"); json_builder_add_string_value (builder, as_review_get_metadata_item (review, "app_id")); json_builder_set_member_name (builder, "locale"); json_builder_add_string_value (builder, gs_plugin_get_locale (plugin)); json_builder_set_member_name (builder, "distro"); json_builder_add_string_value (builder, priv->distro); json_builder_set_member_name (builder, "version"); version = gs_plugin_odrs_sanitize_version (as_review_get_version (review)); json_builder_add_string_value (builder, version); json_builder_set_member_name (builder, "user_display"); json_builder_add_string_value (builder, as_review_get_reviewer_name (review)); json_builder_set_member_name (builder, "summary"); json_builder_add_string_value (builder, as_review_get_summary (review)); json_builder_set_member_name (builder, "description"); json_builder_add_string_value (builder, as_review_get_description (review)); json_builder_set_member_name (builder, "rating"); json_builder_add_int_value (builder, as_review_get_rating (review)); json_builder_end_object (builder); /* export as a string */ json_root = json_builder_get_root (builder); json_generator = json_generator_new (); json_generator_set_pretty (json_generator, TRUE); json_generator_set_root (json_generator, json_root); data = json_generator_to_data (json_generator, NULL); /* clear cache */ if (!gs_plugin_odrs_invalidate_cache (review, error)) return FALSE; /* POST */ uri = g_strdup_printf ("%s/submit", priv->review_server); return gs_plugin_odrs_json_post (gs_plugin_get_soup_session (plugin), uri, data, error); }
static void gs_review_row_refresh (GsReviewRow *row) { GsReviewRowPrivate *priv = gs_review_row_get_instance_private (row); const gchar *reviewer; GDateTime *date; g_autofree gchar *text = NULL; gs_star_widget_set_rating (GS_STAR_WIDGET (priv->stars), as_review_get_rating (priv->review)); reviewer = as_review_get_reviewer_name (priv->review); if (reviewer == NULL) { /* TRANSLATORS: this is when a user doesn't specify a name */ reviewer = _("Unknown"); } gtk_label_set_text (GTK_LABEL (priv->author_label), reviewer); date = as_review_get_date (priv->review); if (date != NULL) text = g_date_time_format (date, "%e %B %Y"); else text = g_strdup (""); gtk_label_set_text (GTK_LABEL (priv->date_label), text); gtk_label_set_text (GTK_LABEL (priv->summary_label), as_review_get_summary (priv->review)); gtk_label_set_text (GTK_LABEL (priv->text_label), as_review_get_description (priv->review)); /* if we voted, we can't do any actions */ if (as_review_get_flags (priv->review) & AS_REVIEW_FLAG_VOTED) priv->actions = 0; /* set actions up */ if ((priv->actions & (1 << GS_PLUGIN_ACTION_REVIEW_UPVOTE | 1 << GS_PLUGIN_ACTION_REVIEW_DOWNVOTE | 1 << GS_PLUGIN_ACTION_REVIEW_DISMISS)) == 0) { gtk_widget_set_visible (priv->box_voting, FALSE); } else { gtk_widget_set_visible (priv->box_voting, TRUE); gtk_widget_set_visible (priv->button_yes, priv->actions & 1 << GS_PLUGIN_ACTION_REVIEW_UPVOTE); gtk_widget_set_visible (priv->button_no, priv->actions & 1 << GS_PLUGIN_ACTION_REVIEW_DOWNVOTE); gtk_widget_set_visible (priv->button_dismiss, priv->actions & 1 << GS_PLUGIN_ACTION_REVIEW_DISMISS); } gtk_widget_set_visible (priv->button_remove, priv->actions & 1 << GS_PLUGIN_ACTION_REVIEW_REMOVE); gtk_widget_set_visible (priv->button_report, priv->actions & 1 << GS_PLUGIN_ACTION_REVIEW_REPORT); /* mark insensitive if no network */ if (priv->network_available) { gtk_widget_set_sensitive (priv->button_yes, TRUE); gtk_widget_set_sensitive (priv->button_no, TRUE); gtk_widget_set_sensitive (priv->button_remove, TRUE); gtk_widget_set_sensitive (priv->button_report, TRUE); } else { gtk_widget_set_sensitive (priv->button_yes, FALSE); gtk_widget_set_sensitive (priv->button_no, FALSE); gtk_widget_set_sensitive (priv->button_remove, FALSE); gtk_widget_set_sensitive (priv->button_report, FALSE); } }